socket中传输图片的问题

panqunjun 2006-09-24 11:14:55
功能实现:两个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;
}
...全文
377 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
panqunjun 2006-09-24
  • 打赏
  • 举报
回复
ok!
我的判断没有错,是的,是输入流的数据没有被flush掉。
那下一不就是消灭原来的输入流中的残杂了?
有好方法,请指教。
panqunjun 2006-09-24
  • 打赏
  • 举报
回复
你说的有道理!
可是,你有时间能否帮我改改,我现在还没有解决方案。

我有点怀疑,client端在接收第一张图片后,在流中是否把原先第一张图片的数据释放掉啊?
C++可以释放输入流,java不可以释放输入流啊!

再听你们的意见!
f_acme 2006-09-24
  • 打赏
  • 举报
回复
Thread.sleep(1000);只用了这个来分开两张图片的数据,那客户端怎么知道现在是第二张图片的数据了啊?
发一个特殊类型的包表示分隔试下吧。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧