netty实现websocket通信
2023-12-13 23:16:56
websocket是基于http的,所以server端在上一篇实现http协议服务基础上在pipeline里再添加一个WebSocketServerProtocolHandler处理器即可。WebSocketServerProtocolHandler需要指定一个路径参数,用来客户端连接使用。
服务端
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup(4);
ServerBootstrap bootstrap = new ServerBootstrap().group(bossGroup,workGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline p = ch.pipeline();
p.addLast(new HttpServerCodec());
p.addLast(new HttpObjectAggregator(65536));
p.addLast(new WebSocketServerProtocolHandler("/chat"));
p.addLast(new CustomeWebSocketFrameHandler());
}
});
bootstrap.bind(8080).sync();
CustomeWebSocketFrameHandler是自定义的handler,将用他来进行websocket消息的处理。在WebSocketServerProtocolHandler处理后,消息报文可以用WebSocketFrame类型进行接收。WebSocketFrame是一个抽象类。有PingWebSocketFrame、PongWebSocketFrame、CloseWebSocketFrame、TextWebSocketFrame、BinaryWebSocketFrame等几个常见子类。其中ping、ping和close在WebSocketServerProtocolHandler已经处理好了,在自定义的handler里只要处理TextWebSocketFrame和BinaryWebSocketFrame就好了。
CustomeWebSocketFrameHandler重写channelRead0方法处理接收消息
protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
if(msg instanceof TextWebSocketFrame){
TextWebSocketFrame frame = (TextWebSocketFrame) msg;
System.out.println("接收消息:"+frame.text());
}else if(msg instanceof BinaryWebSocketFrame){
BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;
String info = frame.content().toString(StandardCharsets.UTF_8);
System.out.println("接收到内容:"+info);
}else{
//TODO
System.out.println(msg);
}
Thread.sleep(1000);
String response = "Hello,"+ LocalDateTime.now().toString();
ctx.channel().writeAndFlush(new TextWebSocketFrame(response));
}
这样服务端的代码就简单准备好了
客户端
客户端使用js来进行收发消息测试
<script>
var socket = new WebSocket("ws://localhost:8080/chat");
socket.onopen = function () {
console.log('connection');
socket.send("hello1");
}
socket.onclose = function () {
console.log('close');
}
socket.onmessage = function (event) {
console.log("message:"+event.data);
socket.send("收到你的消息:"+event.data)
}
setTimeout(function () {
if(socket.readyState === WebSocket.OPEN ){
socket.send("hello");
}
},500);
</script>
分别启动服务端可客户端测试,就能互相收到对应的消息进行处理了。这里只是简单的进行收发测试。可以根据具体场景来进行修改。如对话聊天服务端可以只作为消息中转,多个客户端连接。做监控,服务端可以持续push消息到客户端,直播互动等等场景。使用websocket长连接持续收发对应消息报文。
文章来源:https://blog.csdn.net/sinat_16493273/article/details/134871226
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!