Java中使用websocket实现在线聊天功能
程序员文章站
2022-10-19 20:29:02
很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了socket,关于socket我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位...
很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了socket,关于socket我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位该进程,客户端开启socket分配ip端口连接服务端ip端口,于是两个进程间便可以通信了。下面简单画个图理解。
but,今天还是准备分享websocket的使用,先上效果,再贴代码。
第一步启动socket服务。
然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),ie(李寻欢)进行测试,效果如下。
*
*****************断开一下。
******************断开一下。
下面是本次测试源码。
服务端:
public class testwebsocketcontroller : controller { websocketserver server; list<sessioninfo> listsession = new list<sessioninfo>(); public actionresult index() { return view(); } //服务启动 public string start() { var ip = "192.168.1.106"; var port = "1010"; server = new websocketserver(); if (!server.setup(ip, int.parse(port))) { return "websocket服务启动error"; } //新的会话连接 server.newsessionconnected += sessionconnected; //会话关闭 server.sessionclosed += sessionclosed; //新的消息接收 server.newmessagereceived += messagereceived; if (!server.start()) { //处理监听失败消息 return "error"; } return "success"; } /// <summary> /// 会话关闭 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void sessionclosed(websocketsession session, supersocket.socketbase.closereason value) { debug.writeline("会话关闭,关闭原因:{0} 来自:{1} 时间:{2:hh:mm:ss}", value, session.remoteendpoint, datetime.now); //sendmsgtoremotepoint(sessionid, sessionid + "已断开"); var sessionremove = listsession.firstordefault(s => s.sessionid == session.sessionid); listsession.remove(sessionremove); } /// <summary> /// 会话连接 /// </summary> /// <param name="session"></param> private void sessionconnected(websocketsession session) { debug.writeline("新的会话连接 来自:{0} sessionid:{1} 时间:{2:hh:mm:ss}", session.remoteendpoint, session.sessionid, datetime.now); listsession.add(new sessioninfo { sessionid = session.sessionid, endpoint = session.remoteendpoint.tostring() }); } /// <summary> /// 消息接收 /// </summary> /// <param name="session"></param> /// <param name="value"></param> private void messagereceived(websocketsession session, string value) { //反序列化消息内容 var message = jsonconvert.deserializeobject<messageinfo>(value); foreach (var item in listsession) { ///发送消息 sendmsg(item.sessionid, string.format("{0}发来消息:{1}", message.name, message.message)); } } // <summary> /// 发送消息 /// </summary> /// <param name="sessionid"></param> /// <param name="msg"></param> private void sendmsg(string sessionid, string msg) { var appsession = server.getappsessionbyid(sessionid); if (appsession != null) appsession.send(msg); } public class messageinfo { public string name { get; set; } public string message { get; set; } } public class sessioninfo { public string sessionid { get; set; } public string endpoint { get; set; } //public string name { get; set; } } }
客户端:
@{ viewbag.title = "index"; } <h2>index</h2> <script src="../scripts/jquery-1.8.2.js"></script> <input type="text" id="txtname" /> <input type="button" value="加入聊天室" id="btnconnection" /> <input type="button" value="离开聊天室" id="btndisconnection" /> <input type="text" id="txtinput" /> <input type="button" value="发送" id="btnsend" /> <div id="msg"></div> <script language="javascript" type="text/javascript"> var ws; var url = "ws://192.168.1.106:1010" $("#btnconnection").click(function () { if ("websocket" in window) { ws = new websocket(url); } else if ("mozwebsocket" in window) { ws = new mozwebsocket(url); } else alert("浏览器版本过低,请升级您的浏览器"); //注册各类回调 ws.onopen = function () { $("#msg").append($("#txtname").val() + "加入聊天室<br />"); } ws.onclose = function () { $("#msg").append($("#txtname").val() + "离开聊天室<br />"); } ws.onerror = function () { $("#msg").append("数据传输发生错误<br />"); } ws.onmessage = function (receivemsg) { $("#msg").append(receivemsg.data + "<br />"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { ws.close(); } }); //$("#btndisconnection").click(function () { // $("#msg").append($("#txtname").val() + "离开聊天室<br />"); // ws.close(); //}); $("#btnsend").click(function () { if (ws.readystate == websocket.open) { var message = "{\"name\":\"" + $("#txtname").val() + "\",\"message\":\"" + $("#txtinput").val() + "\"}"; ws.send(message); } else { $("#msg").text("connection is closed!"); } }); </script>
总结
以上所述是小编给大家介绍的java中使用websocket实现在线聊天功能,希望对大家有所帮助