2016-01-21 90 views
2

我想通过Java套接字发送两个字节数组。我通过wireshark捕获了数据,并显示第一个字节数组发送;然而,第二,根本不发送。 我正在使用Linux Mint和Oracle的JRE(不是OpenJDK)。Java套接字无法发送两个字节数组

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(),但它没有区别。

任何想法,为什么这可能是这种情况?

+0

你能发布接收器/客户端代码吗? – osanger

+0

这是客户端代码。服务器的源代码不在我的控制范围之内。 – sofiax

+0

make dos.flush();强制要写数据 – krzydyn

回答

0

也许你在退出程序之前有时间发送缓冲的字节?

或许,如果你加入类似:

for (;;) { 
    final byte x = dis.readByte(); 
    System.out.println("got byte: " + (x & 0xFF)); 
} 

程序不会退出,而且你还可以查看是否有服务器发回更多的字节。可能提供线索。如果你不知道,readInt()读取字节并返回一个由这些字节组成的int,如果读取的所有字节都为零,则返回0。所以你的评论'没有收到更多的数据'。感觉有点模糊。

您也可以尝试创建套接字之后插入

sck.setTcpNoDelay(true); 

。应立即写入网络。我认为。

希望这会有所帮助。

相关问题