简体   繁体   中英

Java TCP Socket send byte array

I'm trying to build a file server using Java TCP sockets. I keep getting an error when I try to send a file over a few KB. The error is as follows:

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)

I am creating the output stream like this:

OutputStream output = clientSocket.getOutputStream()

And the error originates from this line: output.write(sendData, 0, sendData.length)

Where sendData is a byte array I hand make to an agreed upon 'protocol' that is 28 header bytes along with the file. The file it is erroring out on is about 780kB where a 2kB file works perfect. Any ideas?

EDIT: some added context of how I'm making the socket.

            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();
        }

And this is how I'm sending the data: sendData is the bytearray I built to send tArray is the array of bytes of the file that I'm coping into sendData to send

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();

EDIT 2: I used a try catch and got this error now: Software caused connection abort: socket write error

Socket reset by peer means the other end disconnected incorrectly. Check that your client is correctly keeping the socket open.

EDIT: assuming you are using code that looks like this, you shouldn't be using a DataInputStream. If you want to use readByte to receive the data you must use writeByte on the sending side. Your socket reset is probably occuring because the readByte call is not getting SOMETHING it expects. Don't use a DataInputStream: use a BufferedInputStream and use the read method.

I have also googled for similar problems.

One of the rarely mentioned reason is about the cache issue on the browser. Some browsers will reset connections due to some unexpected cache logics.

To solve it, use this line of code in the beginning of your servlet.

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

I got this answer from Servlet to load video file from server . This may not be 100% the same cause of your problems, but worth a try.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM