最近,公司须要一个即时聊天功能。为此,曾尝试SignalR,Tencent Mars,重点研究了下mars项目,该项目支持Android,iOS端通讯,并能对网络进行优化处理,是微信内部运行架构。服务端是基于Netty框架通讯,数据经过protobuf封装,并自定义了一套通讯协议。客户端通讯,经过封装好的类库进行调用。所以,对于项目较急的,上线快速,此方案研究耗时较长,不知足现状。所以,在此先试用简单长链接,并设置好接口,以备后续直接切换成成熟框架。git
做为研究学习记录,对简单长链接作一番记录。github
客户端发起请求,当有可用消息时,直接返回所请求的消息。若是没有可用消息,则等待30秒。请求超时后,继续发起请求。web
服务端主要实现逻辑:ajax
1 [HttpPost] 2 public IActionResult Send([FromBody] Message message) 3 { 4 if (message == null) 5 return Content(""); 9 lock (_messages) 10 { 11 _messages.Add(new Message 12 { 13 QueueID = _messages.Count > 0 ? _messages.Max(q => q.QueueID) + 1 : 1, 14 From = message.From, 15 FromName = _users.FirstOrDefault(u => u.Id == message.From).UserName, 16 To = message.To, 17 ToName = _users.FirstOrDefault(u => u.Id == message.To).UserName, 18 Content = message.Content 19 }); 20 } 21 return Content(""); 22 } 23 24 public IActionResult Receive(long userId, long queueId) 25 { 26 Message retMsg = null; 27 int seconds = 0; 28 do 29 { 30 lock (_messages) 31 { 32 retMsg = _messages.Where(m => (m.To == userId || m.To == 0) && m.From != userId && queueId < m.QueueID).FirstOrDefault(); 33 } 34 if (retMsg == null) 35 { 36 Thread.Sleep(1000); // 5s 37 seconds += 1; 38 } 39 } while (retMsg == null && seconds < 30); 40 return Json(retMsg); 41 }
具体效果:api
1.Web客户,为了方便通讯,先实现简单登陆帐号操做微信
2.Web登陆后效果,简单选择接收用户,实现发送及接收。在此,为了简单起见,以0用户做为群聊标识网络
3.Win端简单按照web端逻辑,展现不一样,实现差很少架构
4.Win及Web端通讯框架
5.Android端简单登陆异步
6.实现的三端通讯效果
做为简单示例,重在实现。而对界面只作了简单显示。
源代码:见github