| socket中传输图片的问题 |
| [ 来源:ITWENKU 时间:2006-9-24 11:14:55 | 浏览:201人次
] |
| |
|
功能实现:两个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; }
Thread.sleep(1000);只用了这个来分开两张图片的数据,那客户端怎么知道现在是第二张图片的数据了啊? 发一个特殊类型的包表示分隔试下吧。
你说的有道理! 可是,你有时间能否帮我改改,我现在还没有解决方案。
我有点怀疑,client端在接收第一张图片后,在流中是否把原先第一张图片的数据释放掉啊? C++可以释放输入流,java不可以释放输入流啊!
再听你们的意见!
ok! 我的判断没有错,是的,是输入流的数据没有被flush掉。 那下一不就是消灭原来的输入流中的残杂了? 有好方法,请指教。
|
|
 |
推荐文章 |
|