我这个加了心跳机制,发现这么一个问题,客户端发送给服务器端的心跳信息如果不加入\n,发现无法触发
服务器端的read0那个方法,但是一旦加上,就会报错
DefaultFullHttpRequest(decodeResult: failure(java.lang.IllegalArgumentException: invalid version format: BODY=NULL]), version: HTTP/1.0, content: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 0, cap: 0))
GET /bad-request HTTP/1.0
贴上代码
protected void channelRead0(ChannelHandlerContext ctx, Object o) throws Exception {
System.out.println(o);
if(o instanceof FullHttpRequest){
//握手阶段 传统http协议
dealHandshake(ctx, (FullHttpRequest) o);
}else if(o instanceof TextWebSocketFrame){
//文本消息处理
dealTextWebSocketFrame(ctx, (TextWebSocketFrame) o);
}else if(o instanceof PingWebSocketFrame){
System.out.println("jin-------------");
//心跳消息处理
}else if(o instanceof CloseWebSocketFrame){
//断开处理
try {
dealCloseWebSocketFrame(ctx);
}catch (Exception e){
e.printStackTrace();
}
}`
这个是服务器端的代码,上面那个报错信息就是o打印出来的
protected void sendPingMsg(ChannelHandlerContext ctx){
Model model = new Model();
model.setType(TypeData.PING);
ctx.channel().writeAndFlush(model+"\n");
heartbeatCount++;
System.out.println(name + " send ping msg to " + ctx.channel().remoteAddress() + "count :" + heartbeatCount);
}
这个是发送的心跳信息,加上了\n 因为网上说必须加这个,没有结束符不然无法识别