1. 项目介绍
很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。此项目主要是基于SuperSocket的消息推送项目,打通了B/S(浏览器/服务器)与C/S(客户端/服务器)的网络通讯。
若有兴趣学习此项目,请点击项目下载地址进行下载
在项目中
- 我们将
GA.SuperSocket.Service
项目作为我们的Web服务站点,在其站点下寄宿了Socket服务,当站点启动后,socket服务也会跟着启动; -
GA.SuperSocket.AppClient
是模仿的桌面程序(PC端),实现登录并接收消息 -
GA.SuperSocket.MobileApp
是模仿的移动手机端(发送消息功能),对这个客户端(发送消息)可以打开多次,相当于有多部手机,发送消息发给Socket服务,由Socket服务转发消息给指定的客户端(PC端)接收消息.
项目截图
-
多个客户端与服务端的socket服务连接并给指定用户发送消息
-
通过浏览器给指定用户发送消息
-
发送离线消息给admin01
通信流程图
实现功能如下:
- 实现模拟手机端对PC端的桌面程序发送消息,即客户端之间形成网络通讯进行消息发送;
- 实现服务端发送消息给PC端的桌面程序;
- 实现客户端掉线后由服务端发送消息后缓存到Redis作为离线消息,当客户端登录上线后立马收到消息;
- 实现客户端断线重连功能。
2. 知识覆盖点
下面是项目所覆盖的知识点介绍:
- C# Winform技术,主要是实现客户端的模拟;
- .net WebService基本使用技巧;
- .net开源SuperSocket实现服务端向指定客户端推送消息;
- IIS程序发布与部署;
- TCP/IP端口号的问题处理以及部署Redis(缓存数据库)的基本操作和使用;
- 为了防止网络抖动出现TCP假死连接,Socket客户端与服务端互发心跳数据包,维持长连接;
- 服务端崩溃或重启站点后Socket客户端实现自动断线重连;
- 防止IIS自动回收应用程序进程的基本设置;
- Redis消息队列存储用户离线数据实现消息的持久化。
学习建议:由于Socket属于高级编程,覆盖的知识点稍微比较多,建议至少拥有C# Winform以及.net mvc的基础初学者可以学习,否则不建议去学。
3. Socket通信基本流程图
4. 框架及代码解读
服务端即部署的IIS站点,PC端和移动端均属于不同平台下的客户端。
4.1. 服务端
4.1.1. 框架解读
-
GA.SuperSocket.Service
属于Web应用程序,.net framework 4.5
版本
-
引用
- 序列化对象和日志组件库;
- redis以及socket核心组件库;
- 读取Web.config的库
- Core
属于项目的核心程序,主要实现了服务端的socket监控、发送心跳数据包维持长连接、接收客户端消息、发送消息、采用redis转发离线消息等功能。 - Model
自定义的实体类 - Service
通过调用Core的核心方法对外提供接口 - Utility
辅助及扩展类 -
AppServiceConfig.xml
xml配置文件,配置了redis的连接字符串
- FastPrintNetService.asmx
作为开放给客户端的Web引用文件,主要是提供接口,默认启动程序时在浏览器打开的文件。 - Global.asax
程序启动文件,初始化配置以及启动socket服务程序 - Packages.config
引用的包文件,包含了各个引用的文件包名、版本、.net framework版本 -
Web.config
主要是配置日志信息(日志组件库、打印日志的输出格式)以及socket监听端口
4.1.2. 初始化配置
-
Socket监听端口
-
启动文件配置
-
运行时注意
4.1.3. 代码解读
- 文件名:
SuperSocketEnginePrintStrategy.cs
是静态文件,不需要new对象就可以直接使用其方法
a) 初始化socket服务
启动socket服务、监听会话连接、监听来自客户端的消息发送、监听会话关闭会话连接:tcpServerEngine_NewSessionConnected
,当客户端一旦上线后socket服务会自动监听到连接请求并创建socket会话,即进入到tcpServerEngine_NewSessionConnected
方法里,即MyAppSession
是客户端请求连接时自动创建的session数据
b) 定时向在线的客户端发送心跳数据包
主要是为了维持与客户端的长连接,因为tcp连接会因为网络等原因出现断连情况,如果断连会导致服务端与客户端无法通信,就好比手机的电话卡处于无服务状态,手机信号其实也是不断地通过发送或接收数据维持电话信号的。具体请看流程图3. socket通信基本流程图。
c) 检测登录用户上线后自动打印离线消息发送给指定用户
- 文件名:
RedisQueueMessageStrategy.cs
a) 初始化redis对象
b) 存储离线消息
配合SuperSocketEnginePrintStrategy
文件中的程序会通过这里的SendMessage
方法发送消息过来,用于存储离线消息到redis中
c) 取出离线消息
配合SuperSocketEnginePrintStrategy
文件中的程序检测到用户一旦上线后,会通过这里的ReceiveMessage
方法从redis取出存储的离线消息
4.2. PC端
4.2.1. 框架解读
-
GA.SuperSocket.AppClient
属于Windows应用程序,.net framework 4.5
版本
-
引用
- 序列化对象和日志组件库;
- socket核心组件库;
- 读取App.config、Web.config的库
-
Web References
引用服务端部接口,采用Web引用,如下图所示:
-
Core
主要是用来加载配置文件AppServiceConfig.xml,获取到远程web服务IP地址和Socket服务器IP地址及端 -
Model
自定义的实体类 -
Resources
放置Winform客户端的一些图标资源 -
Utility
辅助及扩展类 -
App.config
主要是配置日志信息(日志组件库、打印日志的输出格式)以及远程服务地址
-
AppServiceConfig.xml
-
LoginForm.cs
-
MessageMainForm.cs
-
MyTerminatorReceiveFilter.cs
将数据包的数据进行转化,转化为StringPackageInfo
类的格式。注意:发送数据时协议上规定必须以“/r/n”进行结束。 -
Packages.config
引用的包文件,包含了各个引用的文件包名、版本、.net framework
版本 -
Program.cs
程序启动类文件
4.2.2. 代码解读
- 文件名:
Program.cs
是程序启动文件
程序启动后显示登录窗口,填写用户名、密码登录成功后进入到消息窗口。
- 文件名:
MessageMainForm
核心程序就是:
初始化socket并绑定相关事件;
发起对socket服务的连接请求;
发送连接成功后的确认信息给服务端
4.3. 移动端
GA.SuperSocket.MobileApp
此项目比较简单,主要是给在线的指定用户发送消息。
5. Redis部署
下载redis,下载地址:https://redis.io/download
(1)打开命令窗口
本人的安装路径是
C:\\Program Files\Redis
下,Shift +
右键鼠标操作,点击“在此处打开命令窗口
”,进入到命令窗口。(2)启动服务命令
输入下图命令,如果出现下面的图示即表示启动成功。
命令:
redis-server redis.windows.conf
(3)安装服务
由于上面虽然启动了
redis
服务命令,但是只要关闭cmd
窗口,redis
服务就会停止。所以要把redis
设置成windows
下的服务。命令:
redis-server --service-install redis.windows-service.conf --loglevel verbose
(4)启动服务
打开本机上的 任务管理器->服务,找到Redis服务并启动即可。
注意:
启动类型要设置为 自动,否则每次电脑开机,此服务不会自动启动。Redis服务安装时的报错问题
如果出现下图报错,即表示该端口下的服务已被使用,则需要重新启动服务即可。
解决办法:
按照上面的第(1)操作的命令窗口下按顺序输入三次命令:redis-cli.exe
、shutdown
、exit
,然后进入到上面的第(2)步操作
Redis操作命令学习地址:https://www.runoob.com/redis/redis-security.html
地址中包含了我们要给redis设置访问密码的命令行,如下图所示:
redis学习地址:https://www.cnblogs.com/weifeng1463/p/9713594.html
该地址包含了redis客户端的下载https://pan.baidu.com/s/1QvjG30IV-MJFPTF-oV9nVw
以及客户端连接redis的操作方法
6. 本地IIS发布流程
服务端发布
若我们配置的站点长时间未被访问会被IIS自动回收,防止IIS自动回收应用程序进程的基本设置。
客户端发布