-1

ノードがUDPパケットで通信するp2pアプリケーションを実装しています。InputStream から読み取られたパケットが不完全な場合があります。

これが私のコードです:

...

protected String key;
    protected Identifier messId; //Identifier hold a BigInteger
    protected String range;
    protected String concat;

....

public ReplicationMessage(DataInput in) throws IOException {
       fromStream(in);
}


public void fromStream(DataInput in)
    try {
    super.fromStream(in);      

    int length=in.readInt();
    byte[] data=new byte[length];
    in.readFully(data);
    concat = new String(data);
    System.out.println("concat: "+concat); 

            messId = new Identifier(in);

    } catch (IOException e) {
        e.printStackTrace();
    }        
  }

public void toStream(DataOutput out) {
    try {

    super.toStream(out);

    byte[] data = concat.getBytes();
    out.writeInt(data.length);
    out.write(data);        

    messId.toStream(out);

    } catch (IOException e) {

e.printStackTrace();
    }   
}

たとえば、読み取りパケットはいつか完了します。

連結: 179136678282544:140737488355328

ただし、たとえば完全ではない場合もあります

連結: 179136678282544 連結: 179136678282544 連結: 179136678282544

誰でも問題が何であるか教えてもらえますか?

どうもありがとう

送信用の UDP パケットを送受信するためのコードは次のとおりです。

private void sendMessage(int comm, Message message, InetAddress ip, int port) throws IOException {

    ByteArrayOutputStream bout = new ByteArrayOutputStream();

    DataOutputStream dout = new DataOutputStream(bout);

    dout.writeInt(comm);

    dout.writeByte(message.code());

    message.toStream(dout);

    dout.close();

    byte[] data = bout.toByteArray();
    if (data.length > DATAGRAM_BUFFER_SIZE) {
        throw new IOException("Message too big, size="+data.length+
                              " bytes, max="+DATAGRAM_BUFFER_SIZE+" bytes");
    }

    DatagramPacket packet = new DatagramPacket(data, data.length, ip, port);

    socket.send(packet);
}

UDPパケットの受信用

     byte[] buffer = new byte[DATAGRAM_BUFFER_SIZE];

     DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

     socket.receive(packet);

1 台のマシンに属する送信ノードと受信ノード。バッファ受信パケットは、パケット長よりもはるかに大きい 10*1024 バイトに設定されます。

着信データパケットをストリームに変換するコードは次のとおりです

                ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData(),
                                             packet.getOffset(), packet.getLength());

                DataInputStream din = new DataInputStream(bin);

                int comm = din.readInt();

                byte messCode = din.readByte();

                Message message = factory.createMessage(messCode, din);
4

1 に答える 1

0

UDP は、破損したパケットや部分的なパケットを配信しません。すべてのデータを送信していないか、適切に解凍していません。関連するすべてのコードをまだ投稿していないため、正確な場所を言うことはできません。

于 2012-05-24T12:32:27.920 に答える