说起TCP大家肯定都不陌生,传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

那么

对于C#又应该怎么使用TCP呢,实际上微软已经设置了TCP协议的抽象模型类,也就是大家熟知的Socket,以及更高级的TcpClient等,诸如此类的使用,这里也不做多解释。但是对于高并发高性能等问题,这些偏底层的类就需要自己开发了,所以这也是我自己开发RRQMSocket的初衷,希望这个程序集能给你带来惊喜。


一、概述

首先我们先来介绍一下该程序集的一些功能

  1. 完全开源,免费商业使用。
  2. 简单易用
  3. 多线程。
  4. 多地址监听(可以一次性监听多个IP及端口)
  5. 适配器预处理,一键式解决分包粘包、对象解析(如HTTP,Json)等。
  6. 超简单的同步发送、异步发送、接收等操作。
  7. 基于事件驱动,让每一步操作尽在掌握。
  8. 高性能(服务器每秒可接收2.5G流量,约200w条信息)

二、程序集源码、Demo下载

2.1 源码位置

三、安装

Nuget安装RRQMSocket即可,有疑问的小伙伴具体步骤详看链接博客。

VS、Unity安装和使用Nuget包

四、创建TcpService

TcpService是TCP服务器基类,但是不参与实际的数据交互,实际的数据交互由SocketClient完成,所以TcpService的功能只是配置、激活、管理、注销SocketClient类实例。

TcpService service = new TcpService();
service.Connecting += (client, e) => { };//有客户端正在连接
service.Connected += (client, e) => { };//有客户端连接
service.Disconnected += (client, e) => { };//有客户端断开连接
service.Received += (client, byteBlock, requestInfo) =>
{
    //从客户端收到信息
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"已从{client.ID}接收到信息:{mes}");

    client.Send(mes);//将收到的信息直接返回给发送方

    //client.Send("id",mes);//将收到的信息返回给特定ID的客户端

    var clients = service.GetClients();
    foreach (var targetClient in clients)//将收到的信息返回给在线的所有客户端。
    {
        if (targetClient.ID!=client.ID)
        {
            targetClient.Send(mes);
        }
    }
};
                                                                                                             
service.Setup(new RRQMConfig()//载入配置     
    .SetListenIPHosts(new IPHost[] { new IPHost("127.0.0.1:7789"), new IPHost(7790) })//同时监听两个地址
    .SetMaxCount(10000)
    .SetThreadCount(100))
    .Start();//启动

五、创建客户端

TcpClient tcpClient = new TcpClient();
tcpClient.Connected += (client, e) => { };//成功连接到服务器
tcpClient.Disconnected += (client, e) => { };//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received += (client, byteBlock, requestInfo) =>
{
    //从服务器收到信息
    string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
    Console.WriteLine($"接收到信息:{mes}");
};

//声明配置
RRQMConfig config = new RRQMConfig();
config.SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
    .UsePlugin()
    .SetBufferLength(1024*10);

//载入配置
tcpClient.Setup(config);
tcpClient.Connect();
tcpClient.Send("RRQM");

六、总结

实际上,RRQMSocket的方便之处,远不仅仅是接收和发送。它能一键式解决粘分包问题,也能超简单的解决自定义的协议数据。所以,更多的使用说明,请看详细的说明文档

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐