首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

利用socket发送数据的有关问题

2012-09-12 
利用socket发送数据的问题这几天在写PC端和手机端的远程监控,我现在写到截获PC端摄像头的数据并得到Buffer

利用socket发送数据的问题
这几天在写PC端和手机端的远程监控,我现在写到截获PC端摄像头的数据并得到BufferedImage,然后利用ImageIO写到socket的输出流里面,然后在客户端(我先在PC端写的客户端,没有在安卓手机端)里从socket里得到输入流,在用ImageIO写到硬盘里,可是只能写入成功一张图片,然后就会出

Java code
java.net.SocketException: Connection reset by peer: socket write error    at java.net.SocketOutputStream.socketWrite0(Native Method)    at java.net.SocketOutputStream.socketWrite(Unknown Source)    at java.net.SocketOutputStream.write(Unknown Source)    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)    at java.io.BufferedOutputStream.write(Unknown Source)    at java.io.DataOutputStream.writeInt(Unknown Source)    at ss.snow.service.ImageSend$Worker.run(ImageSend.java:91)

这个问题,如果不发送,只是在服务端直接保存到硬盘里可以连续保存。求大神帮忙,现贴代码如下:
服务端:
Java code
private class Worker extends Thread {        private final int[] data = new int[320 * 240];        private FrameGrabbingControl sendFrame;        private Buffer buffer;        private BufferToImage image;        private BufferedImage sendImage;        private ServerSocket ss;        private Socket socket;        private OutputStream outStream;        private boolean isRunning = false;        private DataOutputStream dos;        @Override        public void run() {            try {                ss = new ServerSocket(8000);            } catch (IOException e1) {                e1.printStackTrace();            }            try {                isRunning = true;                while (isRunning) {                    boolean isConnected = false;                    socket = ss.accept();                    outStream = socket.getOutputStream();                                        System.out.println("有客户端连接");                    isConnected = true;                    while (isConnected) {                        sendFrame = control;                        buffer = sendFrame.grabFrame();                        image = new BufferToImage((VideoFormat) buffer.getFormat());                                                                        sendImage = (BufferedImage) image.createImage(buffer);                        /*                        sendImage.getWritableTile(0, 0).getDataElements(0, 0,                                320, 240, data);                        sendImage.releaseWritableTile(0, 0);                        dos = new DataOutputStream(new BufferedOutputStream(outStream));                        for(int i = 0; i < data.length; i++) {                            dos.writeInt(data[i]);                        }                        dos.flush();                        */                        ImageIO.write(sendImage, "JPEG", outStream);                    }                }            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            } finally {                if (outStream != null) {                    try {                        outStream.close();                        outStream = null;                    } catch (IOException e) {                        e.printStackTrace();                    }                }                if (socket != null) {                    try {                        socket.close();                        socket = null;                    } catch (IOException e) {                        e.printStackTrace();                    }                }                if (ss != null) {                    try {                        ss.close();                        ss = null;                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    }

这个服务端里注释掉的代码我想用缓冲区像外发送data,可是这个在本地都不行,这个也不知道为什么。求解答。


客户端:

Java code
public class Conn {    private Socket socket;    private InputStream inStream;    private BufferedImage image;    int i = 0;    public void connect() {        socket = new Socket();        try {            socket.connect(new InetSocketAddress("127.0.0.1", 8000));            inStream = socket.getInputStream();            receive();        } catch (IOException e) {            e.printStackTrace();        }             }        private void receive() {        int i = 0;        try {            while(true) {                image = ImageIO.read(inStream);                ImageIO.write(image, "JPEG", new File("C:/" + i + ".jpg"));                i++;            }        } catch (IOException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        Conn c = new Conn();        c.connect();    }}



[解决办法]
java.net.SocketException: Connection reset by peer: socket write error
要从这个异常入手,知道这个异常的意思再去排查自己的程序。
http://hi.baidu.com/suofang/item/2a80ac9ab7afd588581461f8
[解决办法]
因为你将ImageIO封装了,看不出你是怎么输出和读取Stream的,但是从已有的代码也看出点问题。
你的一个客户端连上服务器读取image,服务器输出一个image就处于阻塞状态了,客户端接收到一个image,到这里都没有问题,但是你客户端接收是放在一个while循环里的,第二次接收就会出问题了,为什么呢,因为此时的服务端已经是处于阻塞状态,它并不会再给客户端输出数据了,你客户端的接收永远收不到东西,当然也就处于阻塞状态。你如果此时再开启一个客户端去连接服务端,你会发现没有任何反应。
你整体思路不对,或者说你还不了解socket的通信机制。
[解决办法]
dos.writeInt(data[i]); 这里出错吧?

我觉得问题在服务器端,

 while(true) {
image = ImageIO.read(inStream);
ImageIO.write(image, "JPEG", new File("C:/" + i + ".jpg"));
i++;
}
你试试看传个小得文件。

热点排行