文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#开源类库SimpleTCP使用方法

2024-04-02 19:55

关注

简介

工作中经常遇到需要实现TCP客户端或服务端的时候,如果每次都自己写会很麻烦且无聊,使用SuperSocket库又太大了。这时候就可以使用SimpleTCP了,当然仅限于C#语言。

SimpleTCP是一个简单且非常有用的 .NET 库,用于处理启动和使用 TCP 套接字(客户端和服务器)的重复性任务,使用起来非常方便、代码也少。它的内部不是直接使用的Socket,而是在TcpClient的基础上进行了再次封装,接口更简单、明了。

它的主要特点如下:

说一下它的不足之处(在我看来完全可以接受):

使用方法

在项目中直接引用SimpleTCP.dll即可, dll文件可以通过NuGet安装或从github下载源码编译。
SimpleTCP内部有一个特殊字符分割字符串的协议可以直接使用,也可以在DataReceived事件处理程序中实现自己的协议。

实现客户端

实现一个客户端的代码如下:


//初始化
var client = new SimpleTcpClient();            

//设置编码格式,默认是UTF8
client.StringEncoder = System.Text.ASCIIEncoding.ASCII;
//设置分隔符,默认是0x13
client.Delimiter = Encoding.ASCII.GetBytes("\r")[0];

//收到分割数据的事件,遇到分隔符就会触发事件
client.DelimiterDataReceived += (sender, msg) => 
{
    Console.WriteLine("DelimiterStr-"+DateTime.Now.ToString()+ msg.MessageString);
};

//收到数据的事件,可以在这里实现自己的协议
client.DataReceived += (sender, msg) => 
{
    //字节数组
    Console.WriteLine("Data:"+BitConverter.ToString(msg.Data));
    //字符串消息
    Console.WriteLine("ReceivedStr:" + msg.MessageString);
};

DelimiterDataReceived和DataReceived内部使用了两个不同的字节链表,解析起来互不影响。这两个事件的处理程序中尽量不要做耗时的操作,否则会影响后续的数据接收。

SimpleTCP没有心跳、重连功能,也没找到反馈客户端连接状态的属性(不建议使用内部TcpClient的连接状态)。我们可以直接扩展这些功能,代码如下:


bool exit = false;
bool connected = false;
Task.Factory.StartNew(() => 
{
    while (!exit) 
    {
        try
        {
            if (connected)
            {
                //发送心跳
                client.Write("");
                Task.Delay(10000).Wait();
            }
            else
            {
                //断线重连
                client.Connect("127.0.0.1", 4196);
                connected = true;
                Task.Delay(1000).Wait();
            }
        }
        catch (Exception)
        {
            connected = false;
            client.Disconnect();
        }
    }               
    
}, TaskCreationOptions.LongRunning);

把上面的代码按顺序复制到控制台的Main函数中,然后加入下面的代码就可以收发数据了:


while (true) 
{
    string strLine = Console.ReadLine();
    if (strLine == "esc") 
    {
        exit = true;
        client.Disconnect();
        return;
    }
    if (connected) 
    { 
        //获取服务端回复的消息,最多等待3秒,收到消息时会提前返回
        //也可以使用Write、WriteLine方法发送数据,WriteLine会自动在后面加上设置的分隔符
        var replyMsg = client.WriteLineAndGetReply(strLine, TimeSpan.FromSeconds(3));
        if (replyMsg != null) 
        {
            Console.WriteLine(replyMsg);
        }
    }
}

注:WriteLineAndGetReply内部使用的是DataReceived,不会自动去除分隔符。

实现服务端

服务端功能比较简单,把收到分割数据加工后返回客户端,代码如下:


//初始化
var server = new SimpleTcpServer();
//设置编码格式,默认是UTF8
server.StringEncoder = System.Text.ASCIIEncoding.ASCII;
server.Delimiter =  Encoding.ASCII.GetBytes("\r")[0];

//分割数据接收事件
server.DelimiterDataReceived += (sender, msg) => 
{
    Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString()+":" + msg.MessageString);
    msg.ReplyLine("Reply-" + msg.MessageString);
};

//数据接收数据
server.DataReceived += (sender, msg) =>
{
    Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString() + ":" + msg.MessageString);
};

//客户端连接事件
server.ClientConnected += (sender, msg) => 
{
    Console.WriteLine("ClientConnected:" + msg.Client.RemoteEndPoint.ToString());
};

//客户端断开事件
server.ClientDisconnected += (sender, msg) =>
{
    Console.WriteLine("ClientDisconnected:" + msg.Client.RemoteEndPoint.ToString());
};

//开始监听
server.Start(4196);
//监听的IP
var listeningIps = server.GetListeningIPs();
//监听的V4Ip
var listeningV4Ips = server.GetListeningIPs().Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);



Task.Factory.StartNew(() =>
{
    while (true)
    {   
        //连接数监控
        int clientsConnected = server.ConnectedClientsCount;
        Console.WriteLine("当前连接的客户端数:" + clientsConnected);
        Task.Delay(10000).Wait();
    }

}, TaskCreationOptions.LongRunning);            
Console.ReadLine();

//停止监听
server.Stop();
Console.WriteLine("停止服务端!");
Console.ReadLine();

总结

上面的代码主要为了展示库的功能,实际使用时可能就几行代码,性能要求不高的项目都可以使用。

项目和库的源码链接如下:

链接: https://pan.baidu.com/s/1NgW4CQsU-1BJGgJHg8X2Fg 提取码: 7vgf

链接: https://pan.baidu.com/s/1_2Gr83mkygHdN6B3KIx56w 提取码: 5kdh

到此这篇关于C#开源类库SimpleTCP的文章就介绍到这了,更多相关C#开源类库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯