6

この問題はサーバー側で発生し、parseDelimitedFrom()が呼び出されました。

クライアント側:

    C2SGainCard.Builder s = C2SGainCard.newBuilder();
    C2SGainCard c2s = s.build();

    GameRequest.Builder  reqBuilder=GameRequest.newBuilder();
    reqBuilder.setBody(c2s.toByteString());
    reqBuilder.setName(C2SGainCard.class.getSimpleName());
    reqBuilder.setPlayerId("3");
    GameRequest request=reqBuilder.build();

    DataOutputStream os = new DataOutputStream(socket.getOutputStream());
    os.write(request.toByteArray());
    os.flush();
    os.close();
    socket.close();

サーバーエンド:

    try{
        DataInputStream is = new DataInputStream(socket.getInputStream());
        GameRequest gameRequest = GameRequest.parseDelimitedFrom(is);
    }catch(Exception ex){
        System.out.println(ex.getMessage());
    }

そして、ここに別の同様の質問があります:

クライアント側:

    C2SSell.Builder s = C2SSell.newBuilder();
    CardOnSell.Builder cardOnSell = CardOnSell.newBuilder();
    cardOnSell.setId(1);
    cardOnSell.setPlayerId(3);
    cardOnSell.setCardId(1);
    cardOnSell.setCurrentPrice(111);
    cardOnSell.setFixedPrice(555);
    cardOnSell.setDescription("cao");

    s.setCardOnSell(cardOnSell.build());

    C2SSell c2s = s.build(); 

ソケット処理は同じでした。

サーバーエンド:

    DataInputStream is = new DataInputStream(socket.getInputStream());
    byte[] b = new byte[1024];
    int len=is.read(b);
    String as = new String(b, 0, len);
    GameRequest gameRequest=GameRequest.parseFrom(as.getBytes());

parseFrom()を再度呼び出すと、サーバー側が中断することがわかります。しかし、2行コメントすると、次のようになります。

cardOnSell.setCurrentPrice(111);
cardOnSell.setFixedPrice(555);

クライアント側では、parseFrom()の呼び出しは問題なく機能しました。最初は、.protoファイルに問題があるのではないかと思いましたが、問題がないことが証明されています...では、この問題はどのようにして発生するのでしょうか。parseFrom()を呼び出す前にいくつかのデータが欠落しているためですか?

4

1 に答える 1

5

parseDelimitedFromフォーマットが何を期待しているのか正確には思い出せませんが、サーバー側で必要なのではないかと思います。parseFrom

os.write(request.toByteArray())ただし、なぜ使用しているのか、実際にを作成しているのかは明確ではありませんDataOutputStreamOutputStreamあなたはちょうどそしてInputStream、書くことができるはずです:

request.writeTo(socket.getOutputStream());

その後:

GameRequest gameRequest = GameRequest.parseFrom(socket.getInputStream());

区切りバージョンが必要な場合は、代わりに使用する必要がありますwriteDelimitedTo

于 2013-01-11T06:42:54.057 に答える