套接字输入流不会逐段读取

时间:2011-03-03 08:49:21

标签: java

我的应用程序有问题,我从套接字读取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逐段读取片段?

3 个答案:

答案 0 :(得分:3)

如果您希望Java逐段读取,您必须做两件事:

  1. 使用UDP,而不是TCP。你可能已经这样做了。
  2. 使用Socket.receive()接收DatagramPacket
  3. 任何流方法都可能无法尊重片段边界。

答案 1 :(得分:2)

TCP中没有“片段”。它是一个字节流。如果要读取特定长度的消息,请使用DataInputStream.readFully()。如果要以与发送消息相同的方式读取消息,则必须为每个消息添加长度字,或使用类型长度值协议或自描述协议(如XML)。

答案 2 :(得分:-1)

如果您使用的是TCP,请确保在编写一个片段后,您的其他程序会调用flush()(或其他语言的等效语句)。否则,您的片段可能会被发送TCP堆栈收集,直到有足够的数据来填充一个TCP数据包(取决于实现和可能的某些设置)。

当然,您仍然不能确定逐个接收数据包/片段,但您至少一定要尽快收到它们。

如果您需要数据包结构,请使用其他协议而不是TCP,或使用TCP协议,它会在数据包开始和结束时显示。