我的应用程序有问题,我从套接字读取ip = 192.168.0.3和port = 502。另一个程序通过片段将消息写入该端口片段(mac fragmnet长度为205字节),我需要逐段读取该消息。但是当我写这篇文章时,我将所有片段都放在一个大片中。
boolean last=false;
int numberFragment=0;
while (((!last)) ) {
numberReceived = socketInputStream.read(buffer);
numberFragment++;
tempBuffer = new byte[numberReceived];
ByteBuffer baferce = ByteBuffer.wrap(tempBuffer);
baferce.put(buffer, 0, numberReceived);
//System.out.println("RECEIVED="+(new String(tempBuffer)));
last=ResponseFragmentCheck.IsLastFragment(tempBuffer, numberFragment);
System.out.println("LAST ="+last);
PrintBytesArray(tempBuffer);
received.add(tempBuffer);
}
我有没有办法让Java逐段读取片段?
答案 0 :(得分:3)
如果您希望Java逐段读取,您必须做两件事:
Socket.receive()
接收DatagramPacket
。任何流方法都可能无法尊重片段边界。
答案 1 :(得分:2)
TCP中没有“片段”。它是一个字节流。如果要读取特定长度的消息,请使用DataInputStream.readFully()。如果要以与发送消息相同的方式读取消息,则必须为每个消息添加长度字,或使用类型长度值协议或自描述协议(如XML)。
答案 2 :(得分:-1)
如果您使用的是TCP,请确保在编写一个片段后,您的其他程序会调用flush()
(或其他语言的等效语句)。否则,您的片段可能会被发送TCP堆栈收集,直到有足够的数据来填充一个TCP数据包(取决于实现和可能的某些设置)。
当然,您仍然不能确定逐个接收数据包/片段,但您至少一定要尽快收到它们。
如果您需要数据包结构,请使用其他协议而不是TCP,或使用TCP协议,它会在数据包开始和结束时显示。