Java TCP Socket发送字节数组
我正在尝试使用 Java TCP 套接字构建文件服务器。当我尝试发送超过几 KB 的文件时,我不断收到错误消息。错误如下:
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个标头字节以及文件。出错的文件大约有 780kB,而 2kB 的文件则完美。有什么想法吗?
编辑:一些关于我如何制作套接字的附加上下文。
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 是我构建用于发送的字节数组 的文件的字节数组
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();
tArray 是我正在将其复制到 sendData 以发送编辑 2 : 我使用了 try catch 现在得到了这个错误:软件导致连接中止:套接字写入错误
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Socket Reset by Peer 表示另一端错误地断开连接。检查您的客户端是否正确保持套接字打开。
编辑:假设您使用的代码如下所示,则不应使用 DataInputStream。如果您想使用
readByte
接收数据,则必须在发送端使用writeByte
。您的套接字重置可能正在发生,因为 readByte 调用没有得到它期望的东西。不要使用 DataInputStream:使用 BufferedInputStream 并使用read
方法。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 usewriteByte
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 theread
method.我也用谷歌搜索过类似的问题。
很少提到的原因之一是浏览器上的缓存问题。某些浏览器会由于某些意外的缓存逻辑而重置连接。
要解决这个问题,请在 servlet 的开头使用这行代码。
response.addHeader("Cache-Control", "no-transform, max-age=0");
我从 Servlet to load video file from server 得到了这个答案。这可能不是 100% 相同的问题原因,但值得一试。
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.