问题发生在服务器端,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();
@H_404_10@服务器端:
try{ DataInputStream is = new DataInputStream(socket.getInputStream()); GameRequest gameRequest = GameRequest.parseDelimitedFrom(is); }catch(Exception ex){ System.out.println(ex.getMessage()); }
@H_404_10@这是另一个类似的问题:
客户端:
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();
@H_404_10@套接字处理是一样的.
服务器端:
DataInputStream is = new DataInputStream(socket.getInputStream()); byte[] b = new byte[1024]; int len=is.read(b); String as = new String(b,len); GameRequest gameRequest=GameRequest.parseFrom(as.getBytes());
@H_404_10@事实证明服务器端将在parseFrom()再次调用时中断.但是当我评论两行时:
cardOnSell.setCurrentPrice(111); cardOnSell.setFixedPrice(555);
@H_404_10@在客户端上,parseFrom()调用刚刚工作没有问题.在frist我怀疑.proto文件有一些问题,并且已经证明那里没有问题……那么这个问题是怎么来的?那是因为我在parseFrom()调用之前错过了一些数据?
最佳答案
我不记得究竟是什么格式parseDelimitedFrom,但我怀疑你只是想在服务器端使用parseFrom.
目前尚不清楚为什么要使用os.write(request.toByteArray()),或者为什么要创建DataOutputStream.您应该只能使用OutputStream和InputStream,编写:
request.writeTo(socket.getOutputStream());
@H_404_10@然后:
GameRequest gameRequest = GameRequest.parseFrom(socket.getInputStream());
@H_404_10@如果您确实需要分隔版本,则需要使用writeDelimitedTo.