netty怎么私聊(Netty网络聊天一聊天室实战)
netty怎么私聊(Netty网络聊天一聊天室实战)MyHttpService.java辅助接口让服务架构更加清晰,这里有两个接口,一个用来处理Http请求,一个处理Webocket请求。1、准备工作添加pom.xml<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.2.Final</version> </dependency> 2、辅助接口实现
之前做过一个IM的项目,里面涉及了基本的聊天功能,所以注意这系列的文章不是练习,不含基础和逐步学习的部分,直接开始实战和思想引导,基础部分需要额外的去补充,我有精力的话可以后续出一系列的文章。
为什么第一篇是聊天室,聊天室是最容易实现的部分。也是IM结构最简单的一部分,其次作单聊和群聊,业务逻辑层层递增,彻底的拿下聊天室的代码,进阶单聊和群聊就很简单了,后续我还会推出直播间的实现。
如果单纯想实现聊天室很简单,但是我尽量会把流程都走全,为了方便理解。
主要由两个功能类实现:初始化类 响应处理类
1、准备工作
添加pom.xml
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.2.Final</version> </dependency>
2、辅助接口实现
辅助接口让服务架构更加清晰,这里有两个接口,一个用来处理Http请求,一个处理Webocket请求。
MyHttpService.java
/** * 处理 http请求 */ public interface MyHttpService { void handleHttpRequest(CHannelHandlerContext ctx FullHttprequest request); } MyWebSocketService.java /** * 处理 Websocket 请求中的frame */ public interface MyWebSocketService { void handleFrame(ChannelHandlerContext ctx WebSocketFrame frame); }
那么问题来了,谁来实现这两个类呢,谁来处理这两种请求的分发呢。
下面来看服务响应处理类:
这下保证你的手机和电脑都在局域网内,就可以访问你自己的群聊了。
6、前端页面
要送就送一套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style type="text/css"> .talk_con{ width:600px; height:500px; border:1px solid #666; margin:50px auto 0; background:#f9f9f9; } .talk_show{ width:580px; height:420px; border:1px solid #666; background:#fff; margin:10px auto 0; overflow:auto; } .talk_input{ width:580px; margin:10px auto 0; } .whotalk{ width:80px; height:30px; float:left; outline:none; } .talk_word{ width:420px; height:26px; padding:0px; float:left; margin-left:10px; outline:none; text-indent:10px; } .talk_sub{ width:56px; height:30px; float:left; margin-left:10px; } .atalk{ margin:10px; } .atalk span{ display:inline-block; background:#0181cc; border-radius:10px; color:#fff; padding:5px 10px; } .btalk{ margin:10px; text-align:right; } .btalk span{ display:inline-block; background:#ef8201; border-radius:10px; color:#fff; padding:5px 10px; } </style> <script type="text/javascript"> // document.onkeydown = function (ev) { if (ev && ev.keyCode == 13){ send(); clear(); } } var socket; if (window.WebSocket) { socket = new WebSocket("ws://192.168.1.33:9999"); // socket = new WebSocket("ws://127.0.0.1:9999"); // socket = new WebSocket("ws://192.168.43.186:9999"); socket.onmessage = function (ev) { atalkAppendIn("接收:" socket.channel ":" ev.data) }; socket.onopen = function () { btalkAppendIn("连接已建立"); } socket.onclose = function () { btalkAppendIn("连接关闭"); }; }else { alert("浏览器不支持"); } function send(){ var message = document.getElementById("talkwords"); if (!window.WebSocket){ return } if (socket.readyState === WebSocket.OPEN){ socket.send(message.value); btalkAppendIn("发送:" message.value); clear(); } else { alert("WebSocket 建立失败"); } } function atalkAppendIn(text) { var append = document.getElementById("words"); append.innerHTML = '<div class="atalk"><span>' text '</span></div>'; } function btalkAppendIn(text) { var append = document.getElementById("words"); append.innerHTML = '<div class="btalk"><span>' text '</span></div>'; } function clear () { var elementById = document.getElementById("talkwords"); elementById.value = ""; } </script> </head> <body> <div class="talk_con"> <div class="talk_show" id="words"> </div> <div class="talk_input"> <!--<select class="whotalk" id="who">--> <!--<option value="0">A说:</option>--> <!--<option value="1">B说:</option>--> <!--</select>--> <input type="text" class="talk_word" id="talkwords"> <input type="button" onclick="send()" value="发送" class="talk_sub" id="talksub"> </div> </div> </body> </html>
- socket = new WebSocket("ws://192.168.1.33:9999");
- 注意这里ip和port与服务一一对应。
- socket.onmessage()是获取socket信息。socket.onopen是创建连接。socket.onclose是关闭连接。socket.send(message.value);是发送socket信息。
控制台输出:
15:12:42.443 [nioEventLoopGroup-3-6] INFO com.fantj.springbootjpa.netty.WebSocketServer - receive textWebSocketFrame from channel: [id: 0x0d08c657 L:/192.168.1.33:9999 - R:/192.168.1.33:50440] 目前一共有2个在线 15:12:42.443 [nioEventLoopGroup-3-6] INFO com.fantj.springbootjpa.netty.WebSocketServer - 消息已发送给[id: 0xacd5c1ad L:/192.168.1.33:9999 - R:/192.168.1.33:50438] 15:12:42.444 [nioEventLoopGroup-3-5] DEBUG io.netty.handler.codec.http.websocketx.WebSocket08FrameEncoder - Encoding WebSocket Frame opCode=1 length=5 15:12:42.443 [nioEventLoopGroup-3-6] INFO com.fantj.springbootjpa.netty.WebSocketServer - write text: TextWebSocketFrame(data: UnpooledUnsafeHeapByteBuf(ridx: 0 widx: 5 cap: 15)) to channel: [id: 0x0d08c657 L:/192.168.1.33:9999 - R:/192.168.1.33:50440]