关键词搜索

源码搜索 ×
×

C#开源类库SimpleTCP

发布2022-03-25浏览752次

详情内容

推荐教程

c# 2015 & 2017 视频教程|xin3721自学网c#入门经典视频教程https://www.jxasp.com/blog

简介#

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

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

它的主要特点如下:

  • 源码简单:源码就几个类,每个类也不大,在了解TcpClient用法的基础上不需要注释就可以看懂。
  • 功能单一:不像其它库一样功能繁多,它只专注于实现简单的TCP客户端、服务端,使用起来不用担心增加系统的复杂性。
  • 使用简单:后面的示例会具体讲解,启动一个客户端或服务端只需要几行代码,想扩展功能也很简单。

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

  • 已停止更新:最后更新时间是2017年,不过库的功能比较简单、单一,也没那么多更新的内容。
  • 性能不是最优的:底层是基于TcpClient的,性能注定不会太高,但能用TcpClient的地方都可以用它。

使用方法#

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

实现客户端#

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

  1. //初始化
  2. var client = new SimpleTcpClient();
  3. //设置编码格式,默认是UTF8
  4. client.StringEncoder = System.Text.ASCIIEncoding.ASCII;
  5. //设置分隔符,默认是0x13
  6. client.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
  7. //收到分割数据的事件,遇到分隔符就会触发事件
  8. client.DelimiterDataReceived += (sender, msg) =>
  9. {
  10. Console.WriteLine("DelimiterStr-"+DateTime.Now.ToString()+ msg.MessageString);
  11. };
  12. //收到数据的事件,可以在这里实现自己的协议
  13. client.DataReceived += (sender, msg) =>
  14. {
  15. //字节数组
  16. Console.WriteLine("Data:"+BitConverter.ToString(msg.Data));
  17. //字符串消息
  18. Console.WriteLine("ReceivedStr:" + msg.MessageString);
  19. };

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

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

  1. bool exit = false;
  2. bool connected = false;
  3. Task.Factory.StartNew(() =>
  4. {
  5. while (!exit)
  6. {
  7. try
  8. {
  9. if (connected)
  10. {
  11. //发送心跳
  12. client.Write("");
  13. Task.Delay(10000).Wait();
  14. }
  15. else
  16. {
  17. //断线重连
  18. client.Connect("127.0.0.1", 4196);
  19. connected = true;
  20. Task.Delay(1000).Wait();
  21. }
  22. }
  23. catch (Exception)
  24. {
  25. connected = false;
  26. client.Disconnect();
  27. }
  28. }
  29. }, TaskCreationOptions.LongRunning);

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

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

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

实现服务端#

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

  1. //初始化
  2. var server = new SimpleTcpServer();
  3. //设置编码格式,默认是UTF8
  4. server.StringEncoder = System.Text.ASCIIEncoding.ASCII;
  5. server.Delimiter = Encoding.ASCII.GetBytes("\r")[0];
  6. //分割数据接收事件
  7. server.DelimiterDataReceived += (sender, msg) =>
  8. {
  9. Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString()+":" + msg.MessageString);
  10. msg.ReplyLine("Reply-" + msg.MessageString);
  11. };
  12. //数据接收数据
  13. server.DataReceived += (sender, msg) =>
  14. {
  15. Console.WriteLine(msg.TcpClient.Client.RemoteEndPoint.ToString() + ":" + msg.MessageString);
  16. };
  17. //客户端连接事件
  18. server.ClientConnected += (sender, msg) =>
  19. {
  20. Console.WriteLine("ClientConnected:" + msg.Client.RemoteEndPoint.ToString());
  21. };
  22. //客户端断开事件
  23. server.ClientDisconnected += (sender, msg) =>
  24. {
  25. Console.WriteLine("ClientDisconnected:" + msg.Client.RemoteEndPoint.ToString());
  26. };
  27. //开始监听
  28. server.Start(4196);
  29. //监听的IP
  30. var listeningIps = server.GetListeningIPs();
  31. //监听的V4Ip
  32. var listeningV4Ips = server.GetListeningIPs().Where(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
  33. Task.Factory.StartNew(() =>
  34. {
  35. while (true)
  36. {
  37. //连接数监控
  38. int clientsConnected = server.ConnectedClientsCount;
  39. Console.WriteLine("当前连接的客户端数:" + clientsConnected);
  40. Task.Delay(10000).Wait();
  41. }
  42. }, TaskCreationOptions.LongRunning);
  43. Console.ReadLine();
  44. //停止监听
  45. server.Stop();
  46. Console.WriteLine("停止服务端!");
  47. Console.ReadLine();

总结#

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

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

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载