马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. TCP Server类
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading.Tasks;
- namespace Xxxxx
- {
- public class TcpServer
- {
- private TcpListener listener;
- private bool isRunning = false;
- private dataProcessdelegate dataProcessFunc;
- public bool StartServer(string ip, int port, dataProcessdelegate dataProcessFunc1)
- {
- if(isRunning == false)
- {
- dataProcessFunc = dataProcessFunc1;
- IPAddress ipAddress = IPAddress.Parse(ip);
- listener = new TcpListener(ipAddress, port);
- Start();
- }
- else
- {
- Stop();
- }
- return isRunning;
- }
- public void Start()
- {
- isRunning = true;
- listener.Start();
- Console.WriteLine($"Server started and listening on port {listener.LocalEndpoint}");
- Task.Run(() => AcceptClientsAsync());
- }
- public void Stop()
- {
- isRunning = false;
- listener.Stop();
- client.Close();
- Console.WriteLine("Server stopped.");
- }
- private async Task AcceptClientsAsync()
- {
- while (isRunning)
- {
- try
- {
- TcpClient client = await listener.AcceptTcpClientAsync(); //#1
- Console.WriteLine("Client connected.");
- HandleClientAsync(client); //#2,前面没有awiat则不会停在HandleClientAsync而是跳到#1。加了awiat则等待HandleClientAsync执行完成
- }
- catch (ObjectDisposedException) when (!isRunning)
- {
- // Server is stopping, ignore this exception
- }
- catch (Exception ex)
- {
- Console.WriteLine($"Error accepting client: {ex.Message}");
- }
- }
- }
- private async Task HandleClientAsync(TcpClient client)
- {
- NetworkStream stream = client.GetStream();
- byte[] buffer = new byte[2048];
- int bytesRead;
- bool isRunningLocally = true; // 局部标志,用于控制循环
- try
- {
- while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0 && isRunningLocally)
- {
- //string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
- string message = System.Text.Encoding.Default.GetString(buffer, 0, bytesRead);
- Console.WriteLine($"Received from client: {message}");
- dataProcessFunc(buffer, bytesRead);
- // 检查服务器是否仍在运行
- if (!isRunning)
- {
- isRunningLocally = false; // 设置标志以跳出循环
- }
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine($"Error handling client: {ex.Message}");
- }
- finally
- {
- client.Close();
- Console.WriteLine("Client disconnected.");
- }
- }
- }
- }
复制代码 2. 主类
- //定义一个数据处理的委托
- dataProcessdelegate dataProcessFunc;
- TcpServer tcpServer = new TcpServer();
- private void buttonOpenServer_Click(object sender, EventArgs e)
- {
- if (serialPort1.IsOpen)
- {
- MessageBox.Show("请先关闭串口!");
- return;
- }
- bool flag;
- dataProcessFunc = new dataProcessdelegate(CmdParseInvoke);
- flag = tcpServer.StartServer(textBoxIP.Text.Trim(), Convert.ToInt32(this.textBoxPort.Text.Trim()), dataProcessFunc);
- if (flag == true) //已连接
- {
- CommType = CommTypeEnum.TcpType;
- buttonOpenServer.Text = "关闭服务";
- buttonOpenServer.BackColor = Color.LightCoral;
- }
- else
- {
- CommType = CommTypeEnum.UnSelectType;
- buttonOpenServer.Text = "打开服务";
- buttonOpenServer.BackColor = Color.LimeGreen;
- }
- }
- private void CmdParseInvoke(byte[] buf, int length)
- {
- Invoke((EventHandler)(delegate
- {
- CmdParse(buf, length);
- })
- );
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |