Java TCP-Socket senden byte-array
Ich versuche zu bauen, ein Datei-server mit Java-TCP-sockets. Ich erhalte eine Fehlermeldung, wenn ich versuche, das senden einer Datei über ein paar KB. Die Fehlermeldung lautet wie folgt:
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)
Ich bin erstellen der Ausgabe-stream wie diese:
OutputStream output = clientSocket.getOutputStream()
Und der Fehler stammt aus dieser Linie:
output.write(sendData, 0, sendData.length)
Wo sendData ist ein byte-array, die ich von hand machen, um ein vereinbartes "Protokoll", das ist 28 header-bytes zusammen mit der Datei. Die Datei ist es erroring auf etwa 780 kB, wo eine 2kB-Datei funktioniert perfekt. Irgendwelche Ideen?
EDIT: einigen zusätzlichen Kontext, wie ich den 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();
}
Und dies ist, wie schicke ich die Daten:
sendData ist das bytearray, das ich gebaut habe zu senden
tArray ist array von bytes von der Datei, die ich bin coping in sendData zu senden
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:
Ich verwendet einen try-catch und habe diesen Fehler jetzt: Software verursacht connection abort: socket write error
Du musst angemeldet sein, um einen Kommentar abzugeben.
- Buchse reset by peer bedeutet das andere Ende getrennt, falsch. Überprüfen Sie, dass Ihr client richtig halten den socket öffnen.
EDIT: vorausgesetzt, Sie verwenden code, der so aussieht, sollten Sie sich nicht mit einem DataInputStream. Wenn Sie verwenden möchten
readByte
um die Daten zu empfangen müssen SiewriteByte
auf der sendenden Seite. Ihre socket-reset ist wahrscheinlich auftreten, weil die readByte-Aufruf ist nicht immer ETWAS, was es erwartet. Nicht mit einem DataInputStream: verwenden Sie ein BufferedInputStream und verwenden Sie dieread
Methode.writeByte
produziert Daten, die identisch mit einem standard-Ausgabestrom istwrite
.Ich habe auch gegoogelt nach ähnlichen Problemen.
Einer der selten erwähnte Grund ist über die cache-Problem im browser. Manche Browser reset-verbindungen durch einige unerwartete cache-Logiken.
Um es zu lösen, verwenden Sie diese Codezeile am Anfang Ihres servlet.
Antwort.addHeader("Cache-Control", "no-transform, max-age=0");
Bekam ich diese Antwort vom Servlet zu laden-video-Datei vom server . Dies ist vielleicht nicht 100% die gleiche Ursache Ihrer Probleme, aber einen Versuch Wert.