• C# TcpClient


    TcpClient 自己封装的话,还是比较麻烦的,可以基于线程,也可以基于异步写,最好的办法是网上找个插件,我发现一个插件还是非常好用的:STTech.BytesIO.Tcp

    下面是这个插件作者的帖子,有兴趣的可以去看看

    TcpClient

    BytesIO | 零基础轻松看懂 C# TCP客户端(完整源码+视频教程)_sttech.bytesio.tcp-CSDN博客

    TcpServer

    BytesIO | C# 超简洁的TCP服务端开发(完整源码+视频教程)_c# bytesio-CSDN博客

    目前网上大部分帖子都是用 PropertyGrid 控件去实现的,其实没必要

    我做了一个简单的界面,如下

    代码:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4. namespace TcpClinetTest2
    5. {
    6. public partial class Form1 : Form
    7. {
    8. public Form1()
    9. {
    10. InitializeComponent();
    11. }
    12. STTech.BytesIO.Tcp.TcpClient tcpClient;
    13. private void Form1_Load(object sender, EventArgs e)
    14. {
    15. this.tcpClient = new STTech.BytesIO.Tcp.TcpClient();
    16. //tcp接收数据时触发的事件
    17. this.tcpClient.OnDataReceived += TcpClient_OnDataReceived;
    18. //tcp连接成功时触发的事件
    19. this.tcpClient.OnConnectedSuccessfully += TcpClient_OnConnectedSuccessfully;
    20. //tcp连接断开时触发的事件
    21. this.tcpClient.OnDisconnected += TcpClient_OnDisconnected;
    22. }
    23. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    24. {
    25. if (this.tcpClient.IsConnected)
    26. this.tcpClient.Disconnect();
    27. }
    28. private void TcpClient_OnDisconnected(object sender, STTech.BytesIO.Core.DisconnectedEventArgs e)
    29. {
    30. Console.WriteLine($"已断开:{e.ReasonCode}");
    31. }
    32. private void TcpClient_OnConnectedSuccessfully(object sender, STTech.BytesIO.Core.ConnectedSuccessfullyEventArgs e)
    33. {
    34. Console.WriteLine("连接成功");
    35. }
    36. private void TcpClient_OnDataReceived(object sender, STTech.BytesIO.Core.DataReceivedEventArgs e)
    37. {
    38. Console.WriteLine($"收到数据:{e.Data.EncodeToString("GBK")}");
    39. }
    40. //连接
    41. private void Button_Connect_Click(object sender, EventArgs e)
    42. {
    43. this.tcpClient.Host = "192.168.xx.xx";
    44. this.tcpClient.Port = 6666;
    45. var result = this.tcpClient.Connect();
    46. Console.WriteLine($"结果:{result.IsSuccess},错误码:{result.ErrorCode}");
    47. }
    48. //断开
    49. private void Button_Disconnect_Click(object sender, EventArgs e)
    50. {
    51. this.tcpClient?.Disconnect();
    52. }
    53. //发送
    54. private void Button_Send_Click(object sender, EventArgs e)
    55. {
    56. string message = TextBox_Message.Text;
    57. if (string.IsNullOrEmpty(message))
    58. {
    59. Console.WriteLine("消息框为空");
    60. return;
    61. }
    62. this.tcpClient.Send(message.GetBytes("GBK"));
    63. }
    64. //清空控制台
    65. private void Button_ClearConsole_Click(object sender, EventArgs e)
    66. {
    67. Console.Clear();
    68. }
    69. //获取在线状态
    70. private void Button_GetOnlineStatus_Click(object sender, EventArgs e)
    71. {
    72. Console.WriteLine($"在线状态:{this.tcpClient.IsConnected}");
    73. }
    74. }
    75. }

    在上面的代码中,message.GetBytes("GBK")  是插件作者封装的拓展方法,如下

    1. public static byte[] GetBytes(this string str, string encodeName = "UTF-8")
    2. {
    3. return Encoding.GetEncoding(encodeName).GetBytes(str);
    4. }

    可以看到,这里用的 Encoding.GetEncoding(encodeName) 去获取 Encoding 编码格式

    常见的编码格式有:

    utf-8

    us-ascii

    windows-1252

    iso-8859-1

    gb2312

    gbk

    big5

    shift_jis

    Euc-kr

    用法:

    Encoding encoding = Encoding.GetEncoding("gb2312");

    也可以使用下面代码来查看有那些编码格式

    1. foreach (EncodingInfo encInfo in Encoding.GetEncodings())
    2. {
    3. Console.WriteLine($"{encInfo.CodePage} - {encInfo.Name}");
    4. }

    end

  • 相关阅读:
    MySQL系统变量之lc_time_names语言环境
    企业如何选择正确的存储服务器租用?
    vue3面试题
    SpringCloud初探
    Ubuntu系统下配置安装区块链Hyperledger Fabric(新手小白篇)
    Spring如何通过三级缓存来解决循环依赖
    QUIC协议详解
    解决GOSUMDB sum.golang.org 连接超时
    JavaFx 使用字体图标记录
    二维码智慧门牌管理系统升级:深入了解5种数据权限
  • 原文地址:https://blog.csdn.net/fkdw27/article/details/139286834