很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了插座,关于套接字我的理解是进程间通信,首先要有服务器跟客户端,服务的启动监听某ip端口定位该进程,客户端开启插座分配ip端口连接服务端ip端口,于是两个进程间便可以通信了。下面简单画个图理解。
,
,但今天还是准备分享websocket的使用,先上效果,再贴代码。
第一步启动插座服务。
,
然后连接客户端连接服务器,加入聊天室,分别使用googel(白玉京,沈浪),火狐(楚留香),即(李寻欢)进行测试,效果如下。
,
*
* * * * * * * * * * * * * * * * *断开一下。
,
* * * * * * * * * * * * * * * * * *断开一下。
,
下面是本次测试源码。
服务端:
公共类TestWebSocketController:控制器 { WebSocketServer服务器; ListlistSession=new List (); 公共ActionResult指数() { 返回视图(); }//服务启动 公共字符串Start () { var ip=" 192.168.1.106”; var端口=" 1010 "; 服务器=new WebSocketServer (); 如果(!服务器。设置(ip, int.Parse(端口))) { 返回“WebSocket服务启动错误”; }//新的会话连接 服务器。NewSessionConnected +=SessionConnected;//会话关闭 服务器。SessionClosed +=SessionClosed;//新的消息接收 服务器。NewMessageReceived +=MessageReceived; 如果(! server.Start ()) {//处理监听失败消息 返回“错误”; } 返回“成功”; }///& lt; summary>///会话关闭///& lt;/summary>///& lt;参数name=盎峄啊弊4? lt;/param>///& lt;参数name=value祝辞& lt;/param> 私人空间SessionClosed (WebSocketSession会话,SuperSocket.SocketBase。CloseReason值) { 调试。WriteLine(“会话关闭,关闭原因:{0}来自:{1}时间:{2:HH: MM: ss}”,价值,会话。RemoteEndPoint DateTime.Now);//SendMsgToRemotePoint (SessionId SessionId +”已断开”); var sessionRemove=listSession。FirstOrDefault (s=比;年代。SessionId==session.SessionID); listSession.Remove (sessionRemove); }///& lt; summary>///会话连接///& lt;/summary>///& lt;参数name=盎峄啊弊4? lt;/param> 私人空间SessionConnected (WebSocketSession会话) { 调试。WriteLine(“新的会话连接来自:{0}SessionID:{1}时间:{2:HH: MM: ss}”,会话。RemoteEndPoint、会话。SessionID DateTime.Now); listSession。添加(新SessionInfo {SessionId=会话。SessionID端点=session.RemoteEndPoint.ToString ()}); }///& lt; summary>///消息接收///& lt;/summary>///& lt;参数name=盎峄啊弊4? lt;/param>///& lt;参数name=value祝辞& lt;/param> 私人空间MessageReceived (WebSocketSession会话,字符串值) {//反序列化消息内容 var消息=JsonConvert.DeserializeObject (价值); foreach (var listSession项) {///发送消息 SendMsg(项目。SessionId,字符串。格式(“{0}发来消息:{1}”,消息。名字,message.Message)); } }//& lt; summary>///发送消息///& lt;/summary>///& lt;参数name=" sessionId祝辞& lt;/param>///& lt;参数name=拔毒弊4? lt;/param> sessionId私人空白SendMsg(字符串,字符串味精) { var appSession=server.GetAppSessionByID (sessionId); 如果(appSession !=null) appSession.Send(味精); } 公开课MessageInfo { 公共字符串名称{;设置;} 公共字符串消息{;设置;} } 公开课SessionInfo { 公共字符串SessionId{得到;设置;} 公共弦端点{得到;设置;}//公共字符串名称{得到;设置;} } }
客户端:
@ { ViewBag。Title=爸甘? } & lt; h3> Index & lt;脚本src=" https://www.yisu.com/Scripts/jquery-1.8.2.js "祝辞& lt;/script> & lt;输入类型="文本" id=" txtName "/比; & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/加入聊天室" id=" btnConnection "/比; & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/离开聊天室" id=" btnDisConnection "/比; & lt;输入类型="文本" id=" txtInput "/比; & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/发送" id=" btnSend "/比; & lt; div id=拔毒弊4? lt;/div> & lt;脚本语言=" javascript " type=" text/javascript祝辞 var ws; var url=" ws://192.168.1.106:1010 " $ (" # btnConnection”)。点击(函数(){ 如果(“WebSocket”窗口){ ws=new WebSocket (url); } else if (“MozWebSocket”窗口){ ws=new MozWebSocket (url); } 其他的 警报(“浏览器版本过低,请升级您的浏览器”);//注册各类回调 ws。onopen=function () { $(" #味精”).append ($ (" # txtName ") .val() +“加入聊天室& lt; br/祝辞”); } ws。onclose=function () { $(" #味精”).append ($ (" # txtName ") .val() +“离开聊天室& lt; br/祝辞”); } ws。onerror=function () { $(" #味精”).append(“数据传输发生错误& lt; br/祝辞”); } ws。onmessage=函数(receiveMsg) { $(" #味精”).append (receiveMsg。数据+“& lt; br/祝辞”); }//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,服务器端会抛异常。 窗口。onbeforeunload=function () { ws.close (); } });//$ (" # btnDisConnection”)。点击(函数(){//$(" #味精”).append ($ (" # txtName ") .val() +“离开聊天室& lt; br/祝辞”);//ws.close ();//}); $ (" # btnSend”)。点击(函数(){ 如果(ws。readyState==WebSocket.OPEN) { 消息var=" {\ \”: \ " + $ (" # txtName ") .val() +“\”, \“消息\”:\ " + $ (" # txtInput ") .val () + " \ "} "; null null null null null null null null null nullJava中使用websocket实现在线聊天功能