问题发生在服务器端,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()再次调用时中断。但是当我评论两行时:
cardOnSell.setCurrentPrice(111);
cardOnSell.setFixedPrice(555);
在客户端上,parseFrom()调用刚刚工作没有问题。在frist我怀疑.proto文件有一些问题,并且已经证明那里没有问题......那么这个问题是怎么来的?因为我在parseFrom()调用之前错过了一些数据吗?
答案 0 :(得分:4)
我无法确切地记住parseDelimitedFrom
期望的格式,但我怀疑你只需要服务器端的parseFrom
。
目前尚不清楚为什么使用os.write(request.toByteArray())
,或者为什么要创建DataOutputStream
。您应该只能使用OutputStream
和InputStream
,写作:
request.writeTo(socket.getOutputStream());
然后:
GameRequest gameRequest = GameRequest.parseFrom(socket.getInputStream());
如果您 想要分隔的版本,则需要使用writeDelimitedTo
代替。