WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > Java 技术 > J2SE / 基础类

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掉。
那下一不就是消灭原来的输入流中的残杂了?
有好方法,请指教。

 相关文章
·高手指导下啊,看不明白
·在XP下为什么连不上SQL server2000?
·出现乱码..
·怎么定义k是全局,静态,整形变量
·构造函数中try/catch
·困饶一天的问题。。。。

 推荐文章
你们帮我改一下这个程序,它的界面怎么没有!
程序为什么会出现这样的异常
Socket问题
finally的神秘问题
右移>>>的问题
如果一个类里的构造函数含有本身类的对象,那该怎么处理的或怎么理解的?
大家遇到过jvm coredump的情况吗
请教: JDBC怎么传一个数(字符串)给数据库?(调用数据库的function)
编写一个java程序
接口修饰符
求救:循环问题,在线等!!!
js里的document.write总是转到新的页面输出???
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.