来自 澳门新葡亰 2019-11-27 16:48 的文章
当前位置: 澳门新葡亰app > 澳门新葡亰 > 正文

首先说实现6个主要的功能,毕竟实现的都是一样

介绍:

前边写过少年老成篇简单的websocke实现服务端。这风流倜傥篇就不在说怎样根基的事物重假设来用实例说话,首即使讲一下跌实单聊和群组闲谈和有着群发的思路设计。

平素不懂的能够看一下上豆蔻梢头篇轻巧版本再来看也行:贯彻劳务端WebSocket传送门

写在始发

地点生机勃勃篇写了风流洒脱篇使用WebSocket做客户端,然后服务端是socke代码实现的。传送门:webSocket和Socket达成闲谈群发

理当如此笔者是准备写到风华正茂章上的,终归实现的都是千篇风度翩翩律的作用,后来想了想就没写在协同,首假如八个地点,

七个缘由是那是另后生可畏种达成服务措施,放在一齐望着有一点点乱。单独写也造福查阅。二是写是抽离写的回乡早晨写一些,不能直接在原著上写,就再也起来三个文稿,但是写完就以为有个别懒,不想结合到一块了。嘿嘿,,,

于是对始发说的不清楚的同校能够先看一下前方的事物。看一下底蕴,一本万利哦。

那大器晚成篇不做功用的改造,既然大家利用了WebSocket为何不接收到底哪,作者厌恶socket的个中现身的卷入央求连接数据管理和发送数据管理。能够未有毛病呀。那您继续往下看吗。

第生龙活虎WebSocket服务器那篇大家依旧促成的6个功效:

  • 单聊:能够钦命人展开闲聊。
  • 群发:这么些的情趣正是时下服务器内的全体人包涵本身,那几个就跟一个推送效果雷同。
  • 展开连接(顾客端卡塔尔:布告除自己以外的装有客户
  • 闭馆连接(顾客端卡塔 尔(英语:State of Qatar):通告除本人以外的享有客商
  • 群组A:完毕二个群组名叫A
  • 群组B:实现二个群组名称叫B

福寿双全效果与利益:

本示例首要落成了个什么事物哪,大家都施用qq可能此外的闲谈工具,全体上面作者说的贵裔也都懂。就不啰嗦废话了。

率先说完毕6个注重的效应:

  • 单聊:能够钦定人展开聊天。
  • 群发:那些的意味正是现阶段服务器内的全部人包涵自身,那些就跟三个推送效果同样。
  • 展开连接(客商端卡塔尔国:公告除本身以外的兼具客户
  • 关门连接(客商端卡塔尔国:公告除本人以外的富有顾客
  • 群组A:达成一个群组名称为A
  • 群组B:完结三个群组名为B

好了基本就是以此大意功用。下边看下最后效果呢:

图片 1图片 2图片 3

上述是第二个图先步向了A群组,前面三个在B群组。然后A有跻身了B群组,全体第一张图能够收到全体聊天,但是前面两张只能采用B群组的闲聊。

技术点

前端写法都以均等的本身就不做过多的陈说了,这里只假如指向socket公约的措施实行改良成WebSocket情势。

首先自身这一次是把劳动写成了貌似管理程序实行挂载的。(某些有性失常的年轻人伴想改访谈路由路线可以参见一下:mvc南路由的酷炫和完成IHttpHandler挂载

自家在本示例正是把位于model下的叁个日常管理程序,改写成了socket路径.

原先访谈是:http“//

改完之后是:http“//

在事实上项目中能够不暴光文件的真是路线地点,依然有一些用途的。

只得说WebSocket确实不错,比如收受发送数据剖析方法都给封装好了。

 先河撸代码(socket版卡塔 尔(阿拉伯语:قطر‎

因为是在地点说道的稿子更改的,全体中央的三持续攻击(开启服务,开启监听,选用事件卡塔尔国小编就不介绍了。

接受情势

既然如此使用WebSocket做协议当然选拔就不要用socket而是选用WebSocket啦。通过在选取到央求后获得上下文中的WebSocket。

            //创建新WebSocket实例
            WebSocket myClientSocket = context.WebSocket;
            string userId = context.QueryString["userId"];

在那间大家有有个别变通正是socke顾客是通过socket随机拿到的,这里自身校勘成了页面传输。前台代码:

 var userId = parseInt(Math.random() * (999999 - 100000 + 1) + 100000, 10);
        console.log(userId)
        ws = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/socket?userId=' + userId);

思路深入分析

我们既是完结的是谈心,那么跟何人闲谈当然是别的人,所以大家相应有别的人,但是难点又来了大家登陆了怎么着确认记录状态哪,作者报到之后我能够跟服务器通信,怎么找到其余人进行报道哪?小编尽管想到的是运用字典Dictionary来拓宽仓库储存,为啥用字典而不用list是因为,字典中是键值积攒,大家把键充任人,然后值存款和储蓄此人的通信连接,这样自个儿朝气蓬勃旦知道这厮就在里头找到此人,然后就取到此人的连续几天就足以通信了。

        //建立登录用户记录信息
        public static Dictionary<string, Socket> ListUser = new Dictionary<string, Socket>();

注:写完这些以往大家特别看了下自家的代码说你这些存在三个主题材料:线程安全,确实的Dictionary不是线程安全,那个时候写的时候没多想,他讲罢本身就想起来了,以前用Paralle时候利用的线程安全类ConcurrentBag和ConcurrentDictionary,在这里了本来能够改成:

       //建立登录用户记录信息
        public static ConcurrentDictionary<string, Socket> ListUser = new ConcurrentDictionary<string, Socket>();

好了作者们得以开展电视发表了,能够找到内定的人开展报导了,这自然全数人的广播发表也足以减轻了。全体小编就直接说下张开连接和倒闭连接的照管。小编在音信选拔和消息发送的时候定义了协和的平整:

开启连接:作者在出殡和下葬的时候最前边带:login字符串告诉新闻选用小编前天是登陆,你告诉外人吧。

关闭连接:退出的时候没有发送字符串所感到空

 ws.send("login,我已经连接上了!!!");

  ws.close();
  alert("关闭了报导")

然后笔者在新闻管理扩张了决断管理:

                   if (string.IsNullOrEmpty(resultList[0]))
                    {
                        //退出                       
                        SignOut(myClientSocket.RemoteEndPoint.ToString());
                        ListUser.Remove(myClientSocket.RemoteEndPoint.ToString());
                        myClientSocket.Shutdown(SocketShutdown.Both);
                        myClientSocket.Close();
                        Debug.WriteLine("当前退出用户:" + myClientSocket.RemoteEndPoint.ToString());
                    }
                    else if (resultList[0] == "login")
                    {
                        //登录
                        Login(myClientSocket.RemoteEndPoint.ToString());
                        ListUser.Add(myClientSocket.RemoteEndPoint.ToString(), myClientSocket);
                        Debug.WriteLine("当前登录用户:" + myClientSocket.RemoteEndPoint.ToString());
                    }

大致其余的思路也是其同样子:单聊,群发,群组都以概念相应的规规矩矩来进行决断然后开展独立的事情。

判读在线方式

WebSocket有单独的景色来拓宽在线的剖断,不用我们休戚相关写判别处理可能相比好的。

                            #region 关闭Socket处理,删除连接池
                            if (myClientSocket.State != WebSocketState.Open)//连接关闭
                            {
                                if (ListUser.ContainsKey(userId)) ListUser.Remove(userId);//删除连接池
                                break;
                            }
                            #endregion

全副肯定逻辑代码

这里是写在了服务端的新闻选拔ReceiveMessage方法内,那些情势是一个联合的发送选择方法。想看原方法的请看上黄金时代篇:落到实处劳务端WebSocket传送门

本人这里只是写了自身要做的效能,当然能够和睦随意改正的。

图片 4图片 5

 var resultStr = AnalyzeClientData(result, receiveNumber);
                    string[] resultList = resultStr.Split(',');
                    //string sendMsg = $"你({myClientSocket.RemoteEndPoint.ToString()}):" + resultList[1] + "【服务端回复】";
                    //myClientSocket.Send(SendMsg(sendMsg));//取消对自己提示发送给别人
                    if (string.IsNullOrEmpty(resultList[0]))
                    {
                        //退出                       
                        SignOut(myClientSocket.RemoteEndPoint.ToString());
                        ListUser.Remove(myClientSocket.RemoteEndPoint.ToString());
                        myClientSocket.Shutdown(SocketShutdown.Both);
                        myClientSocket.Close();
                        Debug.WriteLine("当前退出用户:" + myClientSocket.RemoteEndPoint.ToString());
                    }
                    else if (resultList[0] == "login")
                    {
                        //登录
                        Login(myClientSocket.RemoteEndPoint.ToString());
                        ListUser.Add(myClientSocket.RemoteEndPoint.ToString(), myClientSocket);
                        Debug.WriteLine("当前登录用户:" + myClientSocket.RemoteEndPoint.ToString());
                    }
                    else if (resultList[0] == "all")
                    {
                        //群发所有用户
                        GroupChat(myClientSocket.RemoteEndPoint.ToString(), resultList[1]);
                    }
                    else if (resultList[0] == "groupA")
                    {
                        //群组发送
                        GroupChatA("groupA", myClientSocket.RemoteEndPoint.ToString(), resultList[1]);
                    }
                    else if (resultList[0] == "groupB")
                    {
                        //群组发送
                        GroupChatA("groupB", myClientSocket.RemoteEndPoint.ToString(), resultList[1]);
                    }
                    else
                    {
                        //单聊
                        SingleChat(myClientSocket.RemoteEndPoint.ToString(), resultList[0], resultList[1]);
                    }

View Code

逻辑判定完毕就进来相应的作业方法了,上边笔者把每三个事务方法放上来。

选取多少

WebSocket也远非辜负我们的指望,采用多少的管理也无需我们管理的,使用ReceiveAsync方法可以拿走音讯字节,大家只须求定义叁个字节数组段用来经受就能够,举例:

                        ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);//定义字节数组
                        WebSocketReceiveResult result = await myClientSocket.ReceiveAsync(buffer, CancellationToken.None);//获得字节
                        string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);//发送过来的消息

是或不是深感特别的造福,未有了那多少个颠三倒四的管理了。望着或许挺舒性格很顽强在艰难困苦或巨大压力面前不屈的。

开启连接

图片 6图片 7

#region  登录提示别人
        public void Login(string userId)
        {
            if (ListUser.Count() > 0)
            {
                foreach (var item in ListUser)
                {
                    if (item.Key != userId)
                    {
                        Socket socket = item.Value;
                        try
                        {
                            socket.Send(SendMsg($"用户({userId})登录了"));
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine("该用户已掉线:" + item.Key);
                            //用户已掉线就删除掉
                            ListUser.Remove(item.Key);
                        }
                    }
                }

            }

        }
        #endregion

View Code

发送数据

既是选取多少都有单独的章程封装,发送消息未有道理平昔不的,是的出殡和安葬使用SendAsync方法,使用格局和ReceiveAsync相似,首先定义叁个字节数组段用来贮存内容,例如:

                        ArraySegment<byte> buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes($"用户({userIdA}=>{userIdB}):{msg}"));
                        socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

那规范便是三个出殡和下葬进度,先把要发送的字符串调换到字节数组段,然后把那一个数组段使用SendAsync发送出去就足以了。

 注:在地点的多少个格局中我们都见到了ArraySegment这一个事物,他到底是个什么样哪,他是三个命名在System命名空间下的一个结构体。相近与Array数组可是她又不是数组,为何如此说,因为她能够选取数组段,他得以只保留内容中的生龙活虎局地并非整整。就好像外人说的小抽屉同样。作者是把他领略成先把他放到这里充作数据缓存区,等实际发送的时候进行发送数据。WebSocketMessageType是一个枚举类型,通过F12得以看来:

    // 摘要:
    //     指示消息类型:
    public enum WebSocketMessageType
    {
        //
        // 摘要:
        //     该消息是明文形式。
        Text = 0,
        //
        // 摘要:
        //     消息采用二进制格式。
        Binary = 1,
        //
        // 摘要:
        //     因为收到关闭的消息,接受已完成。
        Close = 2
    }

关门连接

图片 8图片 9

#region  退出提示别人
        public void SignOut(string userId)
        {
            if (ListUser.Count() > 0)
            {
                foreach (var item in ListUser)
                {
                    if (item.Key != userId)
                    {
                        Socket socket = item.Value;
                        try
                        {
                            socket.Send(SendMsg($"用户({userId})退出了"));
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine("该用户已掉线:" + item.Key);
                            //用户已掉线就删除掉
                            ListUser.Remove(item.Key);
                        }
                    }
                }

            }

        }
        #endregion

View Code

 敬上代码

单聊

图片 10图片 11

#region 单聊
        public void SingleChat(string userIdA, string userIdB, string msg)
        {
            Socket socket = ListUser[userIdB];
            if (socket != null)
            {
                try
                {
                    socket.Send(SendMsg($"用户({userIdA}=>{userIdB}):{msg}"));
                }
                catch (Exception e)
                {
                    Debug.WriteLine("该用户已掉线:" + userIdB);
                    //用户已掉线就删除掉
                    ListUser.Remove(userIdB);
                }
            }

        }
        #endregion

View Code

入口函数

貌似管理程序中剖断只采用WebSocket交涉连接步向的周转:

            if (context.IsWebSocketRequest)
            {
                context.AcceptWebSocketRequest(Accept);
            }
            else
            {

            }

群发全体人

图片 12图片 13

#region 群发
        public void GroupChat(string userId, string msg)
        {
            if (ListUser.Count() > 0)
            {
                foreach (var item in ListUser)
                {
                    if (item.Key != userId)
                    {
                        Socket socket = item.Value;
                        try
                        {
                            socket.Send(SendMsg($"用户({userId}=>{item.Key}):{msg}"));
                        }
                        catch (Exception e)
                        {
                            Debug.WriteLine("该用户已掉线:" + item.Key);
                            //用户已掉线就删除掉
                            ListUser.Remove(item.Key);
                        }
                    }
                }

            }

        }
        #endregion

View Code

音讯管理

上边正是允许连接后的基本点措施,近似上生机勃勃篇写的ReceiveMessage方法(接收消息卡塔 尔(阿拉伯语:قطر‎,这里的拍卖存在有的更动,所以小编就把具有代码贴上来了。

 1 #region 处理客户端连接请求
 2         /// <summary>
 3         /// 处理客户端连接请求
 4         /// </summary>
 5         /// <param name="result"></param>
 6         private async Task Accept(AspNetWebSocketContext context)
 7         {
 8             //创建新WebSocket实例
 9             WebSocket myClientSocket = context.WebSocket;
10             string userId = context.QueryString["userId"];
11 
12             try
13             {
14 
15                 string descUser = string.Empty;//目的用户
16                 while (true)
17                 {
18                     if (myClientSocket.State == WebSocketState.Open)
19                     {
20                         ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[2048]);
21                         WebSocketReceiveResult result = await myClientSocket.ReceiveAsync(buffer, CancellationToken.None);
22 
23                         #region 消息处理(字符截取、消息转发)
24                         try
25                         {
26                             #region 关闭Socket处理,删除连接池
27                             if (myClientSocket.State != WebSocketState.Open)//连接关闭
28                             {
29 
30                                 if (ListUser.ContainsKey(userId))
31                                 {
32                                     //退出                       
33                                     SignOut(userId);
34                                     ListUser.Remove(userId);//删除连接池
35                                     Debug.WriteLine("当前退出用户:" + userId);
36                                 }
37                                 break;
38                             }
39                             #endregion
40                             string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);//发送过来的消息
41                             string[] resultList = userMsg.Split(',');
42                             if (resultList[0] == "login")
43                             {
44                                 //登录
45                                 Login(userId);
46                                 #region 用户添加连接池
47                                 //第一次open时,添加到连接池中
48                                 if (!ListUser.ContainsKey(userId))
49                                     ListUser.Add(userId, myClientSocket);//不存在,添加
50                                 else
51                                     if (myClientSocket != ListUser[userId])//当前对象不一致,更新
52                                     ListUser[userId] = myClientSocket;
53                                 #endregion
54                                 Debug.WriteLine("当前登录用户:" + userId);
55                             }
56                             else if (resultList[0] == "all")
57                             {
58                                 //群发所有用户
59                                 GroupChat(userId, resultList[1]);
60                             }
61                             else if (resultList[0] == "groupA")
62                             {
63                                 //群组发送
64                                 GroupChatA("groupA", userId, resultList[1]);
65                             }
66                             else if (resultList[0] == "groupB")
67                             {
68                                 //群组发送
69                                 GroupChatA("groupB", userId, resultList[1]);
70                             }
71                             else
72                             {
73                                 //单聊
74                                 SingleChat(userId, resultList[0], resultList[1]);
75                             }
76 
77                         }
78                         catch (Exception exs)
79                         {
80                             //消息转发异常处理,本次消息忽略 继续监听接下来的消息
81                         }
82                         #endregion
83                     }
84                     else
85                     {
86                         break;
87                     }
88                 }//while end
89             }
90             catch (Exception ex)
91             {
92                 Console.WriteLine("Error : " + ex.ToString());
93             }
94         }
95         #endregion

群组完结

图片 14图片 15

#region 实现群组

        //群组记录分类
        List<GroupHelp> groupList = new List<GroupHelp>();
        public void GroupChatA(string groupName, string userId, string msg)
        {
            if (string.IsNullOrEmpty(groupName))
            {
                return;
            }
            //判断自己是否在群组
            GroupHelp isEisx = groupList.Where(b => b.userId == userId && b.Name == groupName).FirstOrDefault();
            if (isEisx == null)
            {
                groupList.Add(new GroupHelp()
                {
                    Name = groupName,
                    userId = userId
                });
            }
            //根据群组名称判断是否存在群组
            var nowGroupList = groupList.Where(b => b.Name == groupName).ToList();
            foreach (var itemG in nowGroupList)
            {
                Socket socket = ListUser[itemG.userId];
                try
                {
                    socket.Send(SendMsg($"用户({userId}=>{itemG.userId}):{msg}"));
                }
                catch (Exception e)
                {
                    Debug.WriteLine("该用户已掉线:" + itemG.userId);
                    //用户已掉线就删除掉
                    ListUser.Remove(itemG.userId);
                }
            }
        }
        #endregion

View Code

 单聊达成

此间笔者就不把写的装有单聊,群里,实现群组方法贴上来了,完毕的思路如故和早先相似,只是写法不相同,笔者就写三个单聊作为象征示例贴上来。想看整个在下边下载源码就好了。

 #region 单聊
        public void SingleChat(string userIdA, string userIdB, string msg)
        {
            WebSocket socket = ListUser[userIdB];
            if (socket != null)
            {
                if (socket != null && socket.State == WebSocketState.Open)
                {
                    ArraySegment<byte> buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes($"用户({userIdA}=>{userIdB}):{msg}"));
                    socket.SendAsync(buffer, WebSocketMessageType.Binary, true, CancellationToken.None);
                }
            }

        }
        #endregion

 数据处理措施

图片 16图片 17

  #region 打包请求连接数据
        /// <summary>
        /// 打包请求连接数据
        /// </summary>
        /// <param name="handShakeBytes"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        private byte[] PackageHandShakeData(byte[] handShakeBytes, int length)
        {
            string handShakeText = Encoding.UTF8.GetString(handShakeBytes, 0, length);
            string key = string.Empty;
            Regex reg = new Regex(@"Sec-WebSocket-Key:(.*?)rn");
            Match m = reg.Match(handShakeText);
            if (m.Value != "")
            {
                key = Regex.Replace(m.Value, @"Sec-WebSocket-Key:(.*?)rn", "$1").Trim();
            }
            byte[] secKeyBytes = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
            string secKey = Convert.ToBase64String(secKeyBytes);
            var responseBuilder = new StringBuilder();
            responseBuilder.Append("HTTP/1.1 101 Switching Protocols" + "rn");
            responseBuilder.Append("Upgrade: websocket" + "rn");
            responseBuilder.Append("Connection: Upgrade" + "rn");
            responseBuilder.Append("Sec-WebSocket-Accept: " + secKey + "rnrn");
            return Encoding.UTF8.GetBytes(responseBuilder.ToString());
        }
        #endregion

        #region 处理接收的数据
        /// <summary>
        /// 处理接收的数据
        /// 参考 http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html
        /// </summary>
        /// <param name="recBytes"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        private string AnalyzeClientData(byte[] recBytes, int length)
        {
            int start = 0;
            // 如果有数据则至少包括3位
            if (length < 2) return "";
            // 判断是否为结束针
            bool IsEof = (recBytes[start] >> 7) > 0;
            // 暂不处理超过一帧的数据
            if (!IsEof) return "";
            start++;
            // 是否包含掩码
            bool hasMask = (recBytes[start] >> 7) > 0;
            // 不包含掩码的暂不处理
            if (!hasMask) return "";
            // 获取数据长度
            UInt64 mPackageLength = (UInt64)recBytes[start] & 0x7F;
            start++;
            // 存储4位掩码值
            byte[] Masking_key = new byte[4];
            // 存储数据
            byte[] mDataPackage;
            if (mPackageLength == 126)
            {
                // 等于126 随后的两个字节16位表示数据长度
                mPackageLength = (UInt64)(recBytes[start] << 8 | recBytes[start + 1]);
                start += 2;
            }
            if (mPackageLength == 127)
            {
                // 等于127 随后的八个字节64位表示数据长度
                mPackageLength = (UInt64)(recBytes[start] << (8 * 7) | recBytes[start] << (8 * 6) | recBytes[start] << (8 * 5) | recBytes[start] << (8 * 4) | recBytes[start] << (8 * 3) | recBytes[start] << (8 * 2) | recBytes[start] << 8 | recBytes[start + 1]);
                start += 8;
            }
            mDataPackage = new byte[mPackageLength];
            for (UInt64 i = 0; i < mPackageLength; i++)
            {
                mDataPackage[i] = recBytes[i + (UInt64)start + 4];
            }
            Buffer.BlockCopy(recBytes, start, Masking_key, 0, 4);
            for (UInt64 i = 0; i < mPackageLength; i++)
            {
                mDataPackage[i] = (byte)(mDataPackage[i] ^ Masking_key[i % 4]);
            }
            return Encoding.UTF8.GetString(mDataPackage);
        }
        #endregion

        #region 发送数据
        /// <summary>
        /// 把发送给客户端消息打包处理(拼接上谁什么时候发的什么消息)
        /// </summary>
        /// <returns>The data.</returns>
        /// <param name="message">Message.</param>
        private byte[] SendMsg(string msg)
        {
            byte[] content = null;
            byte[] temp = Encoding.UTF8.GetBytes(msg);
            if (temp.Length < 126)
            {
                content = new byte[temp.Length + 2];
                content[0] = 0x81;
                content[1] = (byte)temp.Length;
                Buffer.BlockCopy(temp, 0, content, 2, temp.Length);
            }
            else if (temp.Length < 0xFFFF)
            {
                content = new byte[temp.Length + 4];
                content[0] = 0x81;
                content[1] = 126;
                content[2] = (byte)(temp.Length & 0xFF);
                content[3] = (byte)(temp.Length >> 8 & 0xFF);
                Buffer.BlockCopy(temp, 0, content, 4, temp.Length);
            }
            return content;
        }
        #endregion

View Code

 传送门:

根基版本实现轻松的websocket:落到实处劳务端webSocket连接通信

宏观websocket实现谈心示例:WebSocket和Socket实现闲聊群发

末段在送上github源码:

javascript代码

图片 18图片 19

function webSocketClose() {
    ws.close();
    alert("关闭了通讯")
}
//单聊
function send() {
    var msg = document.getElementById("message").value;
    var data = ""+document.getElementById("userId").value +","+ msg
    if (msg == "" || msg == undefined) {
        alert("请填写发送内容!")
        return;
    }
    ws.send(data);
}
//群发(所有用户)
function sendGroup() {
    var msg = document.getElementById("message").value;
    var data = "all," + msg
    if (msg == "" || msg == undefined) {
        alert("请填写发送内容!")
        return;
    }
    ws.send(data);
}
//群组发送A
function sendGroupA() {
    var msg = document.getElementById("message").value;
    var data = "groupA," + msg
    if (msg == "" || msg == undefined) {
        alert("请填写发送内容!")
        return;
    }
    ws.send(data);
}
//群组发送A
function sendGroupB() {
    var msg = document.getElementById("message").value;
    var data = "groupB," + msg
    if (msg == "" || msg == undefined) {
        alert("请填写发送内容!")
        return;
    }
    ws.send(data);
}

View Code

写在终极

以此便是自身不是依照seesion来举行判别客商的,全数每当刷新了页面也就一定于脱离了现阶段客商,照旧要求再一次开启连接的,那正是贰个基本思路完结。还应该有待完善和不足。还请见谅。代码基本就基本上了。

源码放在了gitHub:

根底版本完成轻易的websocket:完结劳务端webSocket连接通信

劳动版本socket改为websocket完结版本:WebSocket和Socket达成闲聊群发

本文由澳门新葡亰app发布于澳门新葡亰,转载请注明出处:首先说实现6个主要的功能,毕竟实现的都是一样

关键词: