C# 使用Socket通信,新建WinForm服务端、客户端程序

一、新建WinForm Socket服务端程序

注:rtbReceviceMsg为RichTextBox控件

服务端程序、界面


服务端代码

csharp 复制代码
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public virtual void TriggerOnUpdateUI(string message)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new Action<string>(TriggerOnUpdateUI), message);
        }
        else
        {
            rtbReceviceMsg.Text += message + "\n";
        }
    }
    private void btnStartServer_Click(object sender, EventArgs e)
    {
        TcpServer.StartListening(9999, this);
        btnStartServer.Enabled = false;
    }

    private void btnStopServer_Click(object sender, EventArgs e)
    {
        TcpServer.StopListening();
        btnStartServer.Enabled = true;
    }
}
 public class TcpServer
 {
     public static Form1 _mainForm;
     private static TcpListener _listener;
     private static bool _isRunning;
     public static void StartListening(int port, Form1 form)
     {
         _mainForm = form;
         _listener = new TcpListener(IPAddress.Loopback, port);
         _listener.Start();
         _isRunning=true;
         Console.WriteLine("Server listening on port " + port);

         Task.Run(() => ListenForClients());
     }
     public static void ListenForClients()
     {
         while (_isRunning)
         {
             try
             {
                 TcpClient client = _listener.AcceptTcpClient();
                 Console.WriteLine("Client connected");
                 HandleClient(client);
             }
             catch (SocketException)
             {
                 if (!_isRunning)
                 {
                     break;
                 }
             }
         }
     }
     private static void HandleClient(TcpClient client)
     {
         NetworkStream stream = client.GetStream();
         byte[] buffer = new byte[1024];
         int bytesRead;
         while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0)
         {
             string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
             Console.WriteLine("received" + message);
             stream.Write(buffer, 0, bytesRead);

             _mainForm.BeginInvoke(new Action(() => _mainForm.TriggerOnUpdateUI(message)));
         }
     }
     public static void StopListening()
     {
         _isRunning = false;
         _listener?.Stop();
     }
 }

二、新建WinForm Socket客户端程序

客户端程序、界面


客户端代码

csharp 复制代码
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public static void ConnectToServer(string hostname, int port)
    {
        try
        {
            using (TcpClient tcpClient = new TcpClient(hostname, port))
            {
                Console.WriteLine("Connected to server");

                NetworkStream stream = tcpClient.GetStream();

                byte[] data = Encoding.ASCII.GetBytes($"Hellow,Server!{DateTime.Now.ToString()}");
                stream.Write(data, 0, data.Length);
                Console.WriteLine("Sent:Hellow,Server!");

                byte[] buffer = new byte[1024];
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine($"Response: {response}");
            }
        }
        catch (SocketException ex)
        {
            MessageBox.Show($"连接异常:{ex.Message}");
        }
    }
    private void btnStartServer_Click(object sender, EventArgs e)
    {
        ConnectToServer("127.0.0.1", 9999);
    }
}

服务端、客户端程序运行效果

相关推荐
SunnyDays10113 分钟前
使用 C# 将 Excel XLSX 或 XLS 转换为 HTML:完整指南
c#·excel转html·xlsx转html·xls转html
时光追逐者4 分钟前
一款基于 .NET Avalonia 开源免费、快速、跨平台的图片查看器
c#·.net·图片查看器
小朱笼包10 分钟前
小程序实现对接百度AI大模型,通过websocket连接进行百度实时语音识别,将返回的文字调用AI大模型API获得返回的消息内容进行文字转语音朗诵并操作
人工智能·websocket·百度·小程序·语音识别
阿蒙Amon14 小时前
C#每日面试题-Thread.Sleep和Task.Delay的区别
java·数据库·c#
cfqq198915 小时前
Settings,变量保存
开发语言·c#
云草桑16 小时前
.net AI开发04 第八章 引入RAG知识库与文档管理核心能力及事件总线
数据库·人工智能·microsoft·c#·asp.net·.net·rag
曹牧18 小时前
C#:窗体构造函数无法引用窗体控件
开发语言·c#
iAkuya18 小时前
(leetcode)力扣100 54实现Trie树
算法·leetcode·c#
xb113218 小时前
C#使用Cancellation来取消异步任务
开发语言·c#
m0_7482299918 小时前
C与C#:编程语言的核心差异解析
c语言·开发语言·c#