TcpServer.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.Sockets;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace Edge.Core.Processor.Communicator
  9. {
  10. public class TcpServer
  11. {
  12. private TcpListener _listener;
  13. private string _localIp;
  14. private int _port;
  15. public TcpServer(string localIp, int port)
  16. {
  17. _localIp = localIp;
  18. _port = port;
  19. _listener = new TcpListener(IPAddress.Parse(_localIp), _port);
  20. }
  21. public async Task StartAsync()
  22. {
  23. _listener.Start();
  24. Console.WriteLine("Server started. Listening for connections...");
  25. while (true)
  26. {
  27. // 异步等待客户端连接
  28. TcpClient client = await _listener.AcceptTcpClientAsync();
  29. IPEndPoint clientEndPoint = (IPEndPoint)client.Client.RemoteEndPoint;
  30. string clientIp = clientEndPoint.Address.ToString();
  31. int clientPort = clientEndPoint.Port;
  32. Console.WriteLine($"Client connected: {clientIp}:{clientPort}");
  33. // 处理客户端连接
  34. Task.Run(() => HandleClient(client, clientIp, clientPort));
  35. }
  36. }
  37. private async Task HandleClient(TcpClient client, string clientIp, int clientPort)
  38. {
  39. using (client)
  40. {
  41. NetworkStream stream = client.GetStream();
  42. byte[] buffer = new byte[1024];
  43. while (true)
  44. {
  45. try
  46. {
  47. // 从客户端读取数据
  48. int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
  49. if (bytesRead == 0)
  50. {
  51. // 客户端断开连接
  52. break;
  53. }
  54. // 将接收到的数据转换为字符串
  55. string data = Encoding.UTF8.GetString(buffer, 0, bytesRead);
  56. Console.WriteLine($"Received from {clientIp}:{clientPort}: {data}");
  57. // 回应客户端
  58. string response = "Message received: " + data;
  59. byte[] responseBytes = Encoding.UTF8.GetBytes(response);
  60. await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
  61. }
  62. catch (Exception ex)
  63. {
  64. Console.WriteLine($"Error handling client {clientIp}:{clientPort}: {ex.Message}");
  65. break;
  66. }
  67. }
  68. Console.WriteLine($"Client disconnected: {clientIp}:{clientPort}");
  69. }
  70. }
  71. public void Stop()
  72. {
  73. _listener.Stop();
  74. Console.WriteLine("Server stopped.");
  75. }
  76. }
  77. }