简体   繁体   English

Java TCP Socket发送字节数组

[英]Java TCP Socket send byte array

I'm trying to build a file server using Java TCP sockets. 我正在尝试使用Java TCP套接字构建文件服务器。 I keep getting an error when I try to send a file over a few KB. 当我尝试发送超过几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) 错误源自此行: 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. 其中sendData是一个字节数组,我手工制作一个商定的'协议',即28个头字节以及该文件。 The file it is erroring out on is about 780kB where a 2kB file works perfect. 它错误输出的文件大约是780kB,其中2kB文件工作正常。 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 这就是我发送数据的方式:sendData是我发送的bytearray发送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();

EDIT 2: I used a try catch and got this error now: Software caused connection abort: socket write error 编辑2:我使用try catch并立即得到此错误:软件导致连接中止:套接字写入错误

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. 编辑:假设您使用的代码看起来像这样,您不应该使用DataInputStream。 If you want to use readByte to receive the data you must use writeByte on the sending side. 如果要使用readByte接收数据,则必须在发送端使用writeByte Your socket reset is probably occuring because the readByte call is not getting SOMETHING it expects. 您的套接字重置可能正在发生,因为readByte调用未获得预期的SOMETHING。 Don't use a DataInputStream: use a BufferedInputStream and use the read method. 不要使用DataInputStream:使用BufferedInputStream并使用read方法。

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. 要解决它,请在servlet的开头使用这行代码。

response.addHeader("Cache-Control", "no-transform, max-age=0"); response.addHeader(“Cache-Control”,“no-transform,max-age = 0”);

I got this answer from Servlet to load video file from server . 我从Servlet得到了这个答案, 从服务器加载视频文件 This may not be 100% the same cause of your problems, but worth a try. 这可能不是你问题的100%原因,但值得一试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM