基于SuperSocket的消息推送

1. 项目介绍

很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。此项目主要是基于SuperSocket的消息推送项目,打通了B/S(浏览器/服务器)与C/S(客户端/服务器)的网络通讯。

若有兴趣学习此项目,请点击项目下载地址进行下载

在项目中

  1. 我们将GA.SuperSocket.Service项目作为我们的Web服务站点,在其站点下寄宿了Socket服务,当站点启动后,socket服务也会跟着启动;
  2. GA.SuperSocket.AppClient是模仿的桌面程序(PC端),实现登录并接收消息
  3. GA.SuperSocket.MobileApp是模仿的移动手机端(发送消息功能),对这个客户端(发送消息)可以打开多次,相当于有多部手机,发送消息发给Socket服务,由Socket服务转发消息给指定的客户端(PC端)接收消息.

项目截图

  • 多个客户端与服务端的socket服务连接并给指定用户发送消息


    示例图片1

    示例图片2
  • 通过浏览器给指定用户发送消息


    示例图片1

    示例图片2
  • 发送离线消息给admin01


    示例图片1

    示例图片2

通信流程图

通信流程图

实现功能如下:

  1. 实现模拟手机端对PC端的桌面程序发送消息,即客户端之间形成网络通讯进行消息发送;
  2. 实现服务端发送消息给PC端的桌面程序;
  3. 实现客户端掉线后由服务端发送消息后缓存到Redis作为离线消息,当客户端登录上线后立马收到消息;
  4. 实现客户端断线重连功能。

2. 知识覆盖点

下面是项目所覆盖的知识点介绍:

  1. C# Winform技术,主要是实现客户端的模拟;
  2. .net WebService基本使用技巧;
  3. .net开源SuperSocket实现服务端向指定客户端推送消息;
  4. IIS程序发布与部署;
  5. TCP/IP端口号的问题处理以及部署Redis(缓存数据库)的基本操作和使用;
  6. 为了防止网络抖动出现TCP假死连接,Socket客户端与服务端互发心跳数据包,维持长连接;
  7. 服务端崩溃或重启站点后Socket客户端实现自动断线重连;
  8. 防止IIS自动回收应用程序进程的基本设置;
  9. Redis消息队列存储用户离线数据实现消息的持久化。

学习建议:由于Socket属于高级编程,覆盖的知识点稍微比较多,建议至少拥有C# Winform以及.net mvc的基础初学者可以学习,否则不建议去学。

3. Socket通信基本流程图

socket通信基本流程图

4. 框架及代码解读

服务端即部署的IIS站点,PC端和移动端均属于不同平台下的客户端。

4.1. 服务端

4.1.1. 框架解读
示例图1
  1. GA.SuperSocket.Service属于Web应用程序,.net framework 4.5版本
    示例图2
  2. 引用


    示例图3
  • 序列化对象和日志组件库;
  • redis以及socket核心组件库;
  • 读取Web.config的库
  1. Core
    属于项目的核心程序,主要实现了服务端的socket监控、发送心跳数据包维持长连接、接收客户端消息、发送消息、采用redis转发离线消息等功能。
  2. Model
    自定义的实体类
  3. Service
    通过调用Core的核心方法对外提供接口
  4. Utility
    辅助及扩展类
  5. AppServiceConfig.xml
    xml配置文件,配置了redis的连接字符串


    示例图4

    示例图5
  6. FastPrintNetService.asmx
    作为开放给客户端的Web引用文件,主要是提供接口,默认启动程序时在浏览器打开的文件。
  7. Global.asax
    程序启动文件,初始化配置以及启动socket服务程序
  8. Packages.config
    引用的包文件,包含了各个引用的文件包名、版本、.net framework版本
  9. Web.config
    主要是配置日志信息(日志组件库、打印日志的输出格式)以及socket监听端口


    示例图6

    示例图7
4.1.2. 初始化配置
  • Socket监听端口


    示例图7
  • 启动文件配置


    示例图8

    示例图9
  • 运行时注意


    示例图10

    示例图11
4.1.3. 代码解读
  1. 文件名:SuperSocketEnginePrintStrategy.cs是静态文件,不需要new对象就可以直接使用其方法
    a) 初始化socket服务
    示例图12

启动socket服务、监听会话连接、监听来自客户端的消息发送、监听会话关闭会话连接:tcpServerEngine_NewSessionConnected,当客户端一旦上线后socket服务会自动监听到连接请求并创建socket会话,即进入到tcpServerEngine_NewSessionConnected方法里,即MyAppSession是客户端请求连接时自动创建的session数据

示例图13

b) 定时向在线的客户端发送心跳数据包
主要是为了维持与客户端的长连接,因为tcp连接会因为网络等原因出现断连情况,如果断连会导致服务端与客户端无法通信,就好比手机的电话卡处于无服务状态,手机信号其实也是不断地通过发送或接收数据维持电话信号的。具体请看流程图3. socket通信基本流程图
示例图14

c) 检测登录用户上线后自动打印离线消息发送给指定用户
示例图15

  1. 文件名:RedisQueueMessageStrategy.cs
    a) 初始化redis对象
    示例图16

    示例图17

    b) 存储离线消息
    配合SuperSocketEnginePrintStrategy文件中的程序会通过这里的SendMessage方法发送消息过来,用于存储离线消息到redis
    示例图17

    c) 取出离线消息
    配合SuperSocketEnginePrintStrategy文件中的程序检测到用户一旦上线后,会通过这里的ReceiveMessage方法从redis取出存储的离线消息
    示例图18

4.2. PC端

4.2.1. 框架解读
示例图19
  1. GA.SuperSocket.AppClient属于Windows应用程序,.net framework 4.5版本
    示例图20.png
  2. 引用


    示例图20
  • 序列化对象和日志组件库;
  • socket核心组件库;
  • 读取App.config、Web.config的库
  1. Web References
    引用服务端部接口,采用Web引用,如下图所示:


    示例图21

    示例图22

    示例图23

    示例图24
  2. Core
    主要是用来加载配置文件AppServiceConfig.xml,获取到远程web服务IP地址和Socket服务器IP地址及端
  3. Model
    自定义的实体类
  4. Resources
    放置Winform客户端的一些图标资源
  5. Utility
    辅助及扩展类
  6. App.config
    主要是配置日志信息(日志组件库、打印日志的输出格式)以及远程服务地址
    示例图25
  7. AppServiceConfig.xml
    示例图26
  8. LoginForm.cs
    示例图27
  9. MessageMainForm.cs
    示例图28
  10. MyTerminatorReceiveFilter.cs
    将数据包的数据进行转化,转化为StringPackageInfo类的格式。注意:发送数据时协议上规定必须以“/r/n”进行结束。
  11. Packages.config
    引用的包文件,包含了各个引用的文件包名、版本、.net framework版本
  12. Program.cs
    程序启动类文件

4.2.2. 代码解读
  1. 文件名:Program.cs是程序启动文件
示例图29

程序启动后显示登录窗口,填写用户名、密码登录成功后进入到消息窗口

  1. 文件名:MessageMainForm

示例图30

核心程序就是:

  • 初始化socket并绑定相关事件;

  • 发起对socket服务的连接请求;

  • 发送连接成功后的确认信息给服务端

示例图31
4.3. 移动端

GA.SuperSocket.MobileApp此项目比较简单,主要是给在线的指定用户发送消息。

5. Redis部署

下载redis,下载地址:https://redis.io/download

示例图32

示例图33

(1)打开命令窗口
本人的安装路径是C:\\Program Files\Redis下,Shift +右键鼠标操作,点击“在此处打开命令窗口”,进入到命令窗口。
(2)启动服务命令
输入下图命令,如果出现下面的图示即表示启动成功。
命令:redis-server redis.windows.conf
示例图34

(3)安装服务
由于上面虽然启动了redis服务命令,但是只要关闭cmd窗口,redis服务就会停止。所以要把redis设置成windows下的服务。
命令:redis-server --service-install redis.windows-service.conf --loglevel verbose
示例图35

(4)启动服务
打开本机上的 任务管理器->服务,找到Redis服务并启动即可。
注意:启动类型要设置为 自动,否则每次电脑开机,此服务不会自动启动。
示例图35

Redis服务安装时的报错问题

如果出现下图报错,即表示该端口下的服务已被使用,则需要重新启动服务即可。


示例图36

解决办法:
按照上面的第(1)操作的命令窗口下按顺序输入三次命令:redis-cli.exeshutdownexit,然后进入到上面的第(2)步操作

示例图37


Redis操作命令学习地址:https://www.runoob.com/redis/redis-security.html
地址中包含了我们要给redis设置访问密码的命令行,如下图所示:

示例图38

redis学习地址:https://www.cnblogs.com/weifeng1463/p/9713594.html
该地址包含了redis客户端的下载https://pan.baidu.com/s/1QvjG30IV-MJFPTF-oV9nVw
以及客户端连接redis的操作方法

6. 本地IIS发布流程

服务端发布

示例图39

示例图40

若我们配置的站点长时间未被访问会被IIS自动回收,防止IIS自动回收应用程序进程的基本设置。
示例图41

示例图42

示例图43

客户端发布
示例图44

你可能感兴趣的:(基于SuperSocket的消息推送)