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
readByteto receive the data you must usewriteByteon 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 thereadmethod.