功能实现:两个Socket建立连接后,
server 发送,client 接收。
然后server向client发送图片,第一张可以正常接受,第二张就不行了。代码:
//ser.java
import com.sun.image.codec.jpeg.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
import java.net.*;
import java.awt.*;public class Ser extends Thread {

public Ser() {
}

public void run () {

try {

output = new ByteArrayOutputStream();
ss = new ServerSocket(2222);
s = ss.accept();
os = s.getOutputStream();

bi = ImageIO.read(new File("k08.jpg"));
param = JPEGCodec.getDefaultJPEGEncodeParam(bi);
encoder = JPEGCodec.createJPEGEncoder(output, param);
encoder.encode(bi);
output.writeTo(os);
os.flush();
output.flush();


Thread.sleep(1000);
bi = ImageIO.read(new File("k09.jpg"));
param = JPEGCodec.getDefaultJPEGEncodeParam(bi);
encoder = JPEGCodec.createJPEGEncoder(output, param);
encoder.encode(bi);
output.writeTo(os);
os.flush();
output.flush();

System.out.println("Server thread start.");
    }
    catch (Exception ex) {
     ex.printStackTrace();
    }

try {

os.close();
encoder.getOutputStream().close();
    }
    catch (Exception ex) {
     ex.printStackTrace();
    }

}

public static void main(String[] args) throws Exception {

new Ser().start();
}

private BufferedImage bi = null;
private ServerSocket ss = null;
private Socket s = null;
private OutputStream os = null;
private ByteArrayOutputStream output = null;
private JPEGEncodeParam param = null;
private JPEGImageEncoder encoder = null;
}
//Cli.java
import com.sun.image.codec.jpeg.*;
import java.io.*;
import javax.imageio.*;
import java.awt.image.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;class MyFrame extends JFrame {
private MyPanel panel = null;
public MyFrame() {
panel = new MyPanel();
add(panel);
}

public void drawScr(BufferedImage bi) {
panel.draw(bi);
}

private  class MyPanel extends JPanel {

protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bi, 0, 0, null);
}

public void draw(BufferedImage bi) {
this.bi = bi;
this.updateUI();
}

private BufferedImage bi = null;
}
}public class Cli extends Thread {

public Cli() {
try {
//ip = InetAddress.getByName("10.100.101.36");
ip = InetAddress.getLocalHost();
s = new Socket(ip, 2222);
is = s.getInputStream();
    }
    catch (Exception ex) {
     ex.printStackTrace();
     System.err.println("public Client.");
    }
}

public void run() {
frame = new MyFrame();
frame.setSize(500, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

try {


JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(is);
BufferedImage bi = decoder.decodeAsBufferedImage();
if (bi != null) {

frame.drawScr(bi);
System.out.println("drawScr.");
}


Thread.sleep(3000);
decoder = JPEGCodec.createJPEGDecoder(is);
bi = decoder.decodeAsBufferedImage();
if (bi != null) {

frame.drawScr(bi);
System.out.println("drawScr.");
}
    }
    catch (Exception ex) {
     ex.printStackTrace();
    }

}

public static void main(String[] args) throws Exception {
new Cli().start();
} private InetAddress ip = null;
private Socket s = null;
private InputStream is = null;
private MyFrame frame = null;
}

解决方案 »

  1.   

    Thread.sleep(1000);只用了这个来分开两张图片的数据,那客户端怎么知道现在是第二张图片的数据了啊?
    发一个特殊类型的包表示分隔试下吧。
      

  2.   

    你说的有道理!
    可是,你有时间能否帮我改改,我现在还没有解决方案。我有点怀疑,client端在接收第一张图片后,在流中是否把原先第一张图片的数据释放掉啊?
    C++可以释放输入流,java不可以释放输入流啊!再听你们的意见!
      

  3.   

    ok!
    我的判断没有错,是的,是输入流的数据没有被flush掉。
    那下一不就是消灭原来的输入流中的残杂了?
    有好方法,请指教。