1
0

TCPServer.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using UnityEngine;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using ToneTuneToolkit.Common;
  7. public class TCPServer : SingletonMaster<TCPServer>
  8. {
  9. private Thread serverThread;
  10. private TcpListener tcpListener;
  11. private bool isRunning = false;
  12. public int port = 1006;
  13. public delegate void TextReceivedHandler(string text);
  14. public delegate void ImageReceivedHandler(byte[] imageData);
  15. public event TextReceivedHandler OnTextReceived;
  16. public event ImageReceivedHandler OnImageReceived;
  17. // ==================================================
  18. private void Start() => Init();
  19. private void OnDestroy() => UnInit();
  20. // ==================================================
  21. private void Init()
  22. {
  23. StartServer();
  24. }
  25. private void UnInit()
  26. {
  27. StopServer();
  28. }
  29. // ==================================================
  30. public void StartServer()
  31. {
  32. isRunning = true;
  33. serverThread = new Thread(ServerThread);
  34. serverThread.IsBackground = true;
  35. serverThread.Start();
  36. Debug.Log($"[TCP]Server started on port {port}");
  37. }
  38. public void StopServer()
  39. {
  40. isRunning = false;
  41. tcpListener?.Stop();
  42. serverThread?.Abort();
  43. Debug.Log("[TCP]Server stopped");
  44. }
  45. private void ServerThread()
  46. {
  47. try
  48. {
  49. tcpListener = new TcpListener(IPAddress.Any, port);
  50. tcpListener.Start();
  51. while (isRunning)
  52. {
  53. using (TcpClient client = tcpListener.AcceptTcpClient())
  54. using (NetworkStream stream = client.GetStream())
  55. {
  56. // 读取数据长度(4字节)
  57. byte[] lengthBytes = new byte[4];
  58. stream.Read(lengthBytes, 0, 4);
  59. int dataLength = System.BitConverter.ToInt32(lengthBytes, 0);
  60. // 读取数据类型(1字节)
  61. byte[] typeBytes = new byte[1];
  62. stream.Read(typeBytes, 0, 1);
  63. byte dataType = typeBytes[0];
  64. // 读取实际数据
  65. byte[] data = new byte[dataLength];
  66. int bytesRead = 0;
  67. while (bytesRead < dataLength)
  68. {
  69. bytesRead += stream.Read(data, bytesRead, dataLength - bytesRead);
  70. }
  71. // 处理接收到的数据
  72. if (dataType == 0) // 文本
  73. {
  74. string text = Encoding.UTF8.GetString(data);
  75. Debug.Log($"[TCP]Received text: {text}");
  76. UnityMainThreadDispatcher.Instance().Enqueue(() => OnTextReceived?.Invoke(text));
  77. }
  78. else if (dataType == 1) // 图片
  79. {
  80. // 只传递原始字节数据到主线程
  81. byte[] imageData = (byte[])data.Clone();
  82. UnityMainThreadDispatcher.Instance().Enqueue(() =>
  83. {
  84. // 在主线程中创建Texture2D
  85. Texture2D texture = new Texture2D(2, 2);
  86. texture.LoadImage(imageData);
  87. OnImageReceived?.Invoke(imageData);
  88. });
  89. Debug.Log($"[TCP]Received image");
  90. }
  91. }
  92. }
  93. }
  94. catch (SocketException e)
  95. {
  96. if (isRunning)
  97. Debug.LogError($"[TCP]Server error: {e}");
  98. }
  99. }
  100. }