基于长连接简单聊天

一、由来

  最近,公司需要一个即时聊天功能。为此,曾尝试SignalRTencent Mars,重点研究了下mars项目,该项目支持Android,iOS端通信,并能对网络进行优化处理,是微信内部运行架构。服务端是基于Netty框架通信,数据通过protobuf封装,并自定义了一套通信协议。客户端通信,通过封装好的类库进行调用。因此,对于项目较急的,上线快速,此方案研究耗时较长,不满足现状。因此,在此先试用简单长连接,并设置好接口,以备后续直接切换成成熟框架。

作为研究学习记录,对简单长连接做一番记录。

二、实现原理

  客户端发起请求,当有可用消息时,直接返回所请求的消息。如果没有可用消息,则等待30秒。请求超时后,继续发起请求。

三、实例

1.服务端,主要基于.net core api,实现Send(发送消息),Receive(接收消息)业务

服务端主要实现逻辑:

 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 }

2.Web客户端,封装对服务端Send,Receive的调用,并基于Web展示,ajax异步接收

3.Win客户端,封装对服务端Send,Receive的调用

4.Android客户端,封装对服务端Send,Receive的调用

具体效果:

1.Web客户,为了方便通信,先实现简单登录账号操作

2.Web登录后效果,简单选择接收用户,实现发送及接收。在此,为了简单起见,以0用户作为群聊标识

3.Win端简单按照web端逻辑,展示不同,实现差不多

4.Win及Web端通信

5.Android端简单登录

6.实现的三端通信效果

作为简单示例,重在实现。而对界面只做了简单显示。

源代码:见github

时间: 2024-08-29 21:10:13

基于长连接简单聊天的相关文章

Netty学习——通过websocket编程实现基于长连接的双攻的通信

Netty学习(一)基于长连接的双攻的通信,通过websocket编程实现 效果图,客户端和服务器端建立起长连接,客户端发送请求,服务器端响应 但是目前缺少心跳,如果两个建立起来的连接,一个断网之后,另外一个是感知不到对方已经断掉的.以后使用心跳技术来进行连接检测 须知: 状态码101,代表 协议转换,从HTTP协议升级为WebSocket协议 HTTP协议,一般访问的时候:是 Http://localhost:8080/ws WebSocket协议,访问的时候,需要是:ws://localho

基于GUI的简单聊天室01

运用了Socket编程,gui,流的读入和写出,线程控制等 思路: 1.首先是在客户端中先建立好聊天的GUI 2.建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变量来分别表示服务器是否已经开启和是否有客户端连接进来, 利用while循环来让服务器在开启的情况下不断接收客户端的信息.利用DataOutputStream来进行通讯 3.客户端连接服务器(Socket) 首先是客户端的类 1 import java.awt.BorderLayout; 2 impo

Flask基于websocket的简单聊天室

1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.chat.py文件内容如下: from flask import Flask,request,render_template import json from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import

基于Android的简单聊天工具-服务器端

1.数据库用的mysql,一共有3张表,一张用户表user.一张朋友列表friend和一张消息表message. 1 User table 用户表 uid 主键自动生成 userName 昵称 userPwd 密码 userSex 性别 userPho 用户头像,有默认头像 2 Friend table 好友列表 fid 主键自动生成 uid --> fk 用户id,外键 fuid --> 朋友的id fName 好友名称 3 Messages table 消息表 mid 消息id,主键自动生

基于Twisted的简单聊天室

实现了私聊,公聊.用户名密码存在redis.为了拓展,做了简单的模块. #coding=utf8 from twisted.internet import reactor, defer from twisted.protocols.basic import LineReceiver from twisted.internet.protocol import Factory, Protocol, ServerFactory import redis class Server(ServerFacto

基于GUI的简单聊天室02

服务器端 与上一篇相比,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 利用List集合来装载客户端的对象. 还需要注意全局变量的应用. 1 /** 2 * 相比01,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 3 * @author Administrator 4 * 5 */ 6 7 import java.io.DataInputStream; 8 import java.io.DataOutputStream; 9 import java.io

长连接和短连接分析

转自:http://www.cnblogs.com/heyonggang/p/3660600.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向

长连接&amp;短连接分析

转自:http://www.cnblogs.com/heyonggang/p/3660600.html 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的 经典的三次握手示意图: 经典的四次握手关闭图: 2. TCP短连接 我们模拟一下TCP短连接的情况,client向

互联网推送服务原理:长连接+心跳机制(MQTT协议)

互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢: 在写之前,我们首先了解一下为什么Android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给 服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手