Java TCP Socket发送字节数组

标签 java sockets arrays

我正在尝试使用 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 是一个字节数组,我根据商定的“协议(protocol)”手工制作,该协议(protocol)是 28 个 header 字节以及文件。出错的文件大约有 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 是我构建用于发送的字节数组 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: 我使用了 try catch 现在得到了这个错误:软件导致连接中止:套接字写入错误

最佳答案

套接字被对端重置表示另一端错误地断开连接。检查您的客户端是否正确保持套接字打开。

编辑:假设您使用的代码如下所示,则不应使用 DataInputStream。如果您想使用readByte接收数据,则必须在发送端使用writeByte。您的套接字重置可能正在发生,因为 readByte 调用没有得到它期望的东西。不要使用 DataInputStream:使用 BufferedInputStream 并使用 read 方法。

关于Java TCP Socket发送字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944948/

相关文章:

PHP:循环数组/字符串生成器或其他内容的最快方法

java - 如何在我的机器上同时安装多个版本的 Java JDK?

c# - 如何使用某些客户端工具将批量数据插入 Membase Server 1.6

multithreading - 在ZeroMQ中从多个线程到zmq_poll()一个REP套接字+ send()安全吗?

sockets - "Can' t 分配请求的地址“发送到 UdpSocket 时

c - tcp 服务器未绑定(bind)到特定端口

Objective-C:计算对象在数组中出现的次数?

arrays - Matlab 中带有 uigetfile 的非元胞数组

java - JPA 与同一实体的两个单向@OneToMany 关系导致重复条目

java - 如何在单击按钮时重绘 SWT Canvas