| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- using UnityEngine;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- using ToneTuneToolkit.Common;
- public class TCPServer : SingletonMaster<TCPServer>
- {
- private Thread serverThread;
- private TcpListener tcpListener;
- private bool isRunning = false;
- public int port = 1006;
- public delegate void TextReceivedHandler(string text);
- public delegate void ImageReceivedHandler(byte[] imageData);
- public event TextReceivedHandler OnTextReceived;
- public event ImageReceivedHandler OnImageReceived;
- // ==================================================
- private void Start() => Init();
- private void OnDestroy() => UnInit();
- // ==================================================
- private void Init()
- {
- StartServer();
- }
- private void UnInit()
- {
- StopServer();
- }
- // ==================================================
- public void StartServer()
- {
- isRunning = true;
- serverThread = new Thread(ServerThread);
- serverThread.IsBackground = true;
- serverThread.Start();
- Debug.Log($"[TCP]Server started on port {port}");
- }
- public void StopServer()
- {
- isRunning = false;
- tcpListener?.Stop();
- serverThread?.Abort();
- Debug.Log("[TCP]Server stopped");
- }
- private void ServerThread()
- {
- try
- {
- tcpListener = new TcpListener(IPAddress.Any, port);
- tcpListener.Start();
- while (isRunning)
- {
- using (TcpClient client = tcpListener.AcceptTcpClient())
- using (NetworkStream stream = client.GetStream())
- {
- // 读取数据长度(4字节)
- byte[] lengthBytes = new byte[4];
- stream.Read(lengthBytes, 0, 4);
- int dataLength = System.BitConverter.ToInt32(lengthBytes, 0);
- // 读取数据类型(1字节)
- byte[] typeBytes = new byte[1];
- stream.Read(typeBytes, 0, 1);
- byte dataType = typeBytes[0];
- // 读取实际数据
- byte[] data = new byte[dataLength];
- int bytesRead = 0;
- while (bytesRead < dataLength)
- {
- bytesRead += stream.Read(data, bytesRead, dataLength - bytesRead);
- }
- // 处理接收到的数据
- if (dataType == 0) // 文本
- {
- string text = Encoding.UTF8.GetString(data);
- Debug.Log($"[TCP]Received text: {text}");
- UnityMainThreadDispatcher.Instance().Enqueue(() => OnTextReceived?.Invoke(text));
- }
- else if (dataType == 1) // 图片
- {
- // 只传递原始字节数据到主线程
- byte[] imageData = (byte[])data.Clone();
- UnityMainThreadDispatcher.Instance().Enqueue(() =>
- {
- // 在主线程中创建Texture2D
- Texture2D texture = new Texture2D(2, 2);
- texture.LoadImage(imageData);
- OnImageReceived?.Invoke(imageData);
- });
- Debug.Log($"[TCP]Received image");
- }
- }
- }
- }
- catch (SocketException e)
- {
- if (isRunning)
- Debug.LogError($"[TCP]Server error: {e}");
- }
- }
- }
|