我正在尝试通过Java套接字发送两个字节数组。我已经通过Wireshark捕获了数据,它表明第一个字节数组已发送;但是,第二个根本不发送。
我正在使用Linux Mint和Oracle的JRE(不是OpenJDK)。
byte[] packet_one = new byte[] {(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x50};
byte[] packet_two = new byte[] {(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x78};
Socket sck;
DataInputStream dis;
DataOutputStream dos;
try {
sck = new Socket(IP_ADDRESS,PORT);
dis = new DataInputStream(sck.getInputStream());
dos = new DataOutputStream(sck.getOutputStream());
int recv_header = dis.ReadInt(); // This receives the correct response.
dos.write(packet_one); // Sends fine.
dos.write(packet_two); //Does not send.
int data_length = dis.readInt(); // No more data received.
}catch(Exception e) {
System.out.println("Error: " + e.getMessage());
}
因此,dos.write(packet_one)有效(由wireshark确认)。编写packet_two不起作用。由于我也未收到任何数据,因此data_length返回0。没有错误或异常被捕获。
我也尝试过使用dos.flush(),但这没有什么不同。
关于为什么可能会出现这种情况的任何想法?
最佳答案
也许您是在没有时间发送缓冲字节之前退出程序的?
也许如果您添加类似的内容:
for (;;) {
final byte x = dis.readByte();
System.out.println("got byte: " + (x & 0xFF));
}
该程序将不会退出,您还将看到服务器是否还发送了更多的字节。可能会提供线索。
并且,如果您不知道,readInt()读取字节并返回由这些字节组成的int,如果所有读取的for字节均为零,则为0。因此,您的评论是“没有收到更多数据”。感觉有点模棱两可。
您也可以尝试插入一个
sck.setTcpNoDelay(true);
创建套接字后。然后应立即在网络上写入。我认为。
希望这可以帮助。
关于java - Java套接字无法发送两个字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923566/