Я пытаюсь создать файловый сервер, используя сокеты Java TCP. Я продолжаю получать сообщение об ошибке при попытке отправить файл размером более нескольких КБ. Ошибка выглядит следующим образом:
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 байтов заголовка вместе с файлом. Файл с ошибкой составляет около 780 КБ, где файл 2 КБ работает отлично. Есть идеи?
РЕДАКТИРОВАТЬ: некоторый добавленный контекст того, как я делаю сокет.
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 - это байтовый массив, который я создал для отправки
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:
Я использовал перехват попытки и получил эту ошибку сейчас: Программное обеспечение вызвало прерывание соединения: ошибка записи в сокет