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 }); }
public object sendChannelmsg([FromForm] string channel, [FromForm] string message) { WebChatHelper.Publish(channel, message); return(new { code = 0 }); }
public object subscrChannel([FromForm] Guid?websocketId, [FromForm] string channel) { WebChatHelper.Subscribe(websocketId.Value, channel); return(new { code = 0 }); }
public object getChannels() { return(new { code = 0, channels = WebChatHelper.GetChannels() }); }
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 }); }
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)
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}"); } }