java websocket netty_基于netty实现的websocket
一、運行效果
二、Netty使用場景
1.高性能領域
2.多線程并發領域
3.異步通信領域
三、實現過程
①、添加netty相關jar
io.netty
netty-all
5.0.0.Alpha1
②、添加netty配置類public?class?NettyConfig?{
/**
*?存儲每一個客戶端接入進來時的channel對象
*/
public?static?ChannelGroup?group?=?new?DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
}
③、添加websocket核心業務處理類private?WebSocketServerHandshaker?handshaker;
private?static?final?String?WEB_SOCKET_URL?=?"ws://localhost:8888/websocket";
//客戶端與服務端創建連接的時候調用
@Override
public?void?channelActive(ChannelHandlerContext?ctx)?throws?Exception?{
NettyConfig.group.add(ctx.channel());
System.out.println("客戶端與服務端連接開啟...");
}
//客戶端與服務端斷開連接的時候調用
@Override
public?void?channelInactive(ChannelHandlerContext?ctx)?throws?Exception?{
NettyConfig.group.remove(ctx.channel());
System.out.println("客戶端與服務端連接關閉...");
}
//服務端接收客戶端發送過來的數據結束之后調用
@Override
public?void?channelReadComplete(ChannelHandlerContext?ctx)?throws?Exception?{
ctx.flush();
}
//工程出現異常的時候調用
@Override
public?void?exceptionCaught(ChannelHandlerContext?ctx,?Throwable?cause)?throws?Exception?{
cause.printStackTrace();
ctx.close();
}
//服務端處理客戶端websocket請求的核心方法
@Override
protected?void?messageReceived(ChannelHandlerContext?context,?Object?msg)?throws?Exception?{
//處理客戶端向服務端發起http握手請求的業務
if?(msg?instanceof?FullHttpRequest)?{
handHttpRequest(context,??(FullHttpRequest)msg);
}else?if?(msg?instanceof?WebSocketFrame)?{?//處理websocket連接業務
handWebsocketFrame(context,?(WebSocketFrame)msg);
}
}
/**
*?處理客戶端與服務端之前的websocket業務
*?@param?ctx
*?@param?frame
*/
private?void?handWebsocketFrame(ChannelHandlerContext?ctx,?WebSocketFrame?frame){
//判斷是否是關閉websocket的指令
if?(frame?instanceof?CloseWebSocketFrame)?{
handshaker.close(ctx.channel(),?(CloseWebSocketFrame)frame.retain());
}
//判斷是否是ping消息
if?(frame?instanceof?PingWebSocketFrame)?{
ctx.channel().write(new?PongWebSocketFrame(frame.content().retain()));
return;
}
//判斷是否是二進制消息,如果是二進制消息,拋出異常
if(?!?(frame?instanceof?TextWebSocketFrame)?){
System.out.println("目前我們不支持二進制消息");
throw?new?RuntimeException("【"+this.getClass().getName()+"】不支持消息");
}
//返回應答消息
//獲取客戶端向服務端發送的消息
String?request?=?((TextWebSocketFrame)?frame).text();
System.out.println("服務端收到客戶端的消息====>>>"?+?request);
TextWebSocketFrame?tws?=?new?TextWebSocketFrame(new?Date().toString()
+?ctx.channel().id()
+?"?===>>>?"
+?request);
//群發,服務端向每個連接上來的客戶端群發消息
NettyConfig.group.writeAndFlush(tws);
}
④、websocket初始化時各個組件的類實現public?class?MyWebSocketChannelHandler?extends?ChannelInitializer?{
@Override
protected?void?initChannel(SocketChannel?e)?throws?Exception?{
e.pipeline().addLast("http-codec",?new?HttpServerCodec());
e.pipeline().addLast("aggregator",?new?HttpObjectAggregator(65536));
e.pipeline().addLast("http-chunked",?new?ChunkedWriteHandler());
e.pipeline().addLast("handler",?new?MyWebSocketHandler());
}
}
四、項目結構圖
五、補充
總結
以上是生活随笔為你收集整理的java websocket netty_基于netty实现的websocket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java finereport_java
- 下一篇: java http post 传参数_H