Java TCP Socket发送字节数组

时间:2011-05-10 03:48:37

标签: java sockets bytearray

我正在尝试使用Java TCP套接字构建文件服务器。当我尝试发送超过几KB的文件时,我一直收到错误。错误如下:

Exception in thread "main" java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at fileServer.TCPServer.main(TCPServer.java:193)

我正在创建输出流:

OutputStream output = clientSocket.getOutputStream()

错误源自此行: output.write(sendData, 0, sendData.length)

其中sendData是一个字节数组,我交给一个商定的'协议',即28个头字节以及该文件。它错误输出的文件大约是780kB,其中2kB文件工作正常。有什么想法吗?

编辑:一些关于我如何制作套接字的背景。

            Socket clientSocket = listenSocket.accept();
        System.out.println("server is listening...");

        DataInputStream input = new DataInputStream(clientSocket.getInputStream());
        OutputStream output = clientSocket.getOutputStream();



        //receive the request packet
        //int nb = input.readInt();
        System.out.println("Read Length " + "28");
        byte[] sentence = new byte[28];
        for(int i=0; i<28; i++){
            sentence[i] = input.readByte();
        }

这就是我发送数据的方式: sendData是我发送的bytearray tArray是我正在处理sendData发送

的文件的字节数组
for(int i = 0; i<filSize; i++){
   //loads into the packet being built
   //needed to minus 36 since all the header info
   endData[i+36] = tArray[i];
}
System.out.println("send packet size: " + sendData.length);

System.out.print(sendData);
System.out.println("File size is: " + filSize);
int sendDataLength = sendData.length;
try{
    output.write(sendData, 0, sendDataLength);
}catch (IOException e){
    System.out.println("Error: " + e.getMessage());
}
clientSocket.close();

编辑2: 我使用了try catch并且现在得到了这个错误:软件导致连接中止:套接字写入错误

2 个答案:

答案 0 :(得分:2)

通过对等方重置套接字表示另一端未正确断开连接。检查您的客户端是否正确地保持套接字打开。

编辑:假设您使用的代码类似于此,则不应使用DataInputStream。如果您想使用readByte来接收数据,则必须在发送方使用writeByte。您的套接字重置可能正在发生,因为readByte调用未获得预期的SOMETHING。不要使用DataInputStream:使用BufferedInputStream并使用read方法。

答案 1 :(得分:0)

我也搜索过类似的问题。

很少提到的一个原因是浏览器上的缓存问题。由于某些意外的缓存逻辑,某些浏览器将重置连接。

要解决此问题,请在servlet的开头使用这行代码。

response.addHeader(“Cache-Control”,“no-transform,max-age = 0”);

我从Servlet to load video file from server得到了这个答案。这可能不是你问题的100%原因,但值得一试。