0

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

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

8 Comments

Using 2 different clients in 2 different languages I still get the error. The biggest file I've gotten to work without the error so far is 12kB.
Well, you might be making the same error in both clients. Are you reading the incoming data correctly in both clients? It'll be hard to decipher without any code.
I added some more server side code but I don't have access to the client code at the moment. I'll grab it off the other computer if you don't see anything wrong with what I have shown for the server so far.
@Fermi, readByte() can't get something that it doesn't expect - it reads a byte from the stream. It certainly can't directly cause the remote end to issue a disconnect. Depending on how the client is sending data, using a DataInputStream might be a perfectly good solution here.
@davmac: see download.oracle.com/javase/6/docs/api/java/io/…. It notes See the general contract of the readByte method of DataInput.. If you look at DataInput (at download.oracle.com/javase/6/docs/api/java/io/…) it says This method is suitable for reading the byte written by the writeByte method of interface DataOutput. I'm uncertain if DataOutput's writeByte produces data that is identical to a standard OutputStream's write.
|
0

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.