使用websocket实现在线聊天功能

小说:第67届美国电视艾美奖作者:密宗杜董更新时间:2019-03-26字数:23074

使用websocket实现在线聊天功能


  很早以前为了快速达到效果,使用轮询实现了在线聊天功能,后来无意接触了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>

 

 

 

 

 

当前文章:http://zxqss.com/html_38177.html

发布时间:2019-03-26 01:41:35

人间,只是抹去了脂粉的脸 如果不死,我们就要见面 成长营:优秀的孩子也需要成长 走近同性恋 117年前的今天,天堂里多了位茜茜公主 古龙逝世三十周年:酒色财气,浪荡一生 生命与爱 突破“离婚”或“凑合过”的婚姻困惑 为什么我们要称呼他为芈月呢? 喜欢的东西想占为己有,是正常的儿童心理发展的现象

不伦恋之父亲爱上了女儿的同学 不弃旧也迎新 为孩子去学心理学,必要么? 你从来都不知道今天在地铁里能遇见谁 触目惊心的当代“官赌” 可能与老虎伍兹一样是“性爱成瘾”患者! 最好的时光 文字艺术监理-斗胆预测一门新的职业 儿童心理:你觉得心理何时产生? 陈忠实:60岁后回白鹿原,泪眼模糊 如何应对宝宝的第一个叛逆期! 罗李华谈八字算命之改运与补运 发现儿童心理健康问题的11个信号 易经大师罗李华浅谈艺名 终于找到适合自己的学习方法 圣诞节预热:诺心lecake星愿蛋糕真好吃! “舍”而后才会有所“得” 就这样,成为女人说“我还要”的男人 “情绪识别”就是“安全教育”

编辑:文丁戏董

我要说两句: (0人参与)

发布