Пример #1
0
 public object sendmsg([FromForm] Guid senderWebsocketId, [FromForm] Guid receiveWebsocketId, [FromForm] string message, [FromForm] bool isReceipt = false)
 {
     WebChatHelper.SendMsg(senderWebsocketId, new[] { receiveWebsocketId }, message, isReceipt);
     return(new {
         code = 0
     });
 }
Пример #2
0
 public object sendChannelmsg([FromForm] string channel, [FromForm] string message)
 {
     WebChatHelper.Publish(channel, message);
     return(new {
         code = 0
     });
 }
Пример #3
0
 public object subscrChannel([FromForm] Guid?websocketId, [FromForm] string channel)
 {
     WebChatHelper.Subscribe(websocketId.Value, channel);
     return(new {
         code = 0
     });
 }
Пример #4
0
 public object getChannels()
 {
     return(new {
         code = 0,
         channels = WebChatHelper.GetChannels()
     });
 }
Пример #5
0
        async public Task <object> preConnect([FromForm] Guid?websocketId)
        {
            if (websocketId == null)
            {
                websocketId = Guid.NewGuid();
            }
            var server = WebChatHelper.GetServer(websocketId.Value);
            var token  = $"{Guid.NewGuid()}{Guid.NewGuid()}{Guid.NewGuid()}{Guid.NewGuid()}".Replace("-", "");
            await RedisHelper.SetAsync($"webchat_token_{token}", Newtonsoft.Json.JsonConvert.SerializeObject((websocketId, this.Ip)), 10);

            return(new {
                code = 0,
                server = $"ws://{server}/ws?token={token}",
                websocketId = websocketId
            });
        }
Пример #6
0
    public static void SendMsg(Guid senderId, Guid[] receiveIds, object message, bool receipt = false)
    {
        receiveIds = receiveIds.Distinct().ToArray();
        Dictionary <string, List <Guid> > redata = new Dictionary <string, List <Guid> >();

        foreach (var uid in receiveIds)
        {
            string server = WebChatHelper.GetServer(uid);
            if (redata.ContainsKey(server) == false)
            {
                redata.Add(server, new List <Guid>());
            }
            redata[server].Add(uid);
        }
        foreach (string channel in redata.Keys)
        {
            RedisHelper.Publish($"webchat_{channel}", new WebChatMessage {
                Type = WebChatMessageType.发送消息,
                Data = (senderId, redata[channel], JsonConvert.SerializeObject(message), receipt)
Пример #7
0
        public static void RedisSubsrcMessage(CSRedis.CSRedisClient.SubscribeMessageEventArgs e)
        {
            //注意:redis服务重启以后,需要重新启动服务,不然redis通道无法重连
            try {
                var msg = WebChatMessage.Parse(e.Body);
                switch (msg.Type)
                {
                case WebChatMessageType.发送消息:
                    var data = msg.GetData <(string sender, string[] receives, string content, bool receipt)>();
                    Console.WriteLine($"收到消息:{data.content}" + (data.receipt ? "【需回执】" : ""));

                    var outgoing = new ArraySegment <byte>(Encoding.UTF8.GetBytes(data.content));
                    foreach (var uid in data.receives)
                    {
                        List <WebSocketHandler> sock = null;
                        if (_websockets.TryGetValue(uid, out sock) == false)
                        {
                            //Console.WriteLine($"websocket{uid} 离线了,{data.content}" + (data.receipt ? "【需回执】" : ""));
                            if (uid != data.sender && data.receipt)
                            {
                                WebChatHelper.SendMsg(Guid.Parse(uid), new Guid[] { Guid.Parse(data.sender) }, new {
                                    data.content,
                                    receipt = "用户不在线"
                                });
                            }
                            //未找到socket
                            continue;
                        }

                        WebSocketHandler[] sockarray;
                        try {
                            sockarray = sock.ToArray();
                        } catch {
                            lock (_websockets_lock)
                                sockarray = sock.ToArray();
                        }

                        //如果接收消息人是发送者,并且接口端只有1个以下,则不发送
                        //只有接口者为多端时,才转发消息通知其他端
                        if (uid == data.sender && sockarray.Length <= 1)
                        {
                            continue;
                        }

                        foreach (WebSocketHandler sh in sockarray)
                        {
                            sh.socket.SendAsync(outgoing, WebSocketMessageType.Text, true, CancellationToken.None);
                        }

                        if (uid != data.sender && data.receipt)
                        {
                            WebChatHelper.SendMsg(Guid.Parse(uid), new Guid[] { Guid.Parse(data.sender) }, new {
                                data.content,
                                receipt = "发送成功"
                            });
                        }
                    }
                    break;

                case WebChatMessageType.线:
                    lock (_websockets_lock)
                        _websockets.Remove(string.Concat(msg.Data));
                    break;

                case WebChatMessageType.线:
                    break;
                }
            } catch (Exception ex) {
                Console.WriteLine($"订阅方法出错了:{ex.Message}");
            }
        }