tcp局域网简单通讯

打印 上一主题 下一主题

主题 947|帖子 947|积分 2841

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
///using PimDeWitte.UnityMainThreadDispatcher;
using UnityEngine.UI;
using UnityEngine.Video;
using System.IO;
using System.Collections;
using UnityEngine.Networking;
using System.Collections.Generic;
using System.Linq;
public class TCPServer : MonoBehaviour
{
// Port to listen for incoming connections
public int serverPort = 8888;
  1. // TCP listener
  2. TcpListener listener;
  3. //public Test Test;
  4. // Start is called before the first frame update
  5. void Start()
  6. {
复制代码
// Test = GetComponent();
StartServer();
// PlayVideo(“初始场景”);
}

  1. // Method to start the TCP server
  2. void StartServer()
  3. {
  4.     try
  5.     {
  6.         listener = new TcpListener(IPAddress.Any, serverPort);
  7.         listener.Start();
  8.         Debug.Log("Server started, listening on port " + serverPort);
  9.         isCliect = true;
  10.         // Start accepting incoming connections in a separate thread
  11.         Thread acceptThread = new Thread(new ThreadStart(AcceptConnections));
  12.         acceptThread.Start();
  13.     }
  14.     catch (Exception e)
  15.     {
  16.       //  Debug.LogError("Failed to start server: " + e.Message);
  17.     }
  18. }
  19. // Method to accept incoming connections
  20. void AcceptConnections()
  21. {
  22.     while (true)
  23.     {
  24.         try
  25.         {
  26.             TcpClient client = listener.AcceptTcpClient();
  27.             Debug.Log("Client connected: " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString());
  28.             // Handle client communication in a separate thread
  29.             Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
  30.             clientThread.Start(client);
  31.         }
  32.         catch (Exception e)
  33.         {
  34.             //Debug.LogError("Error accepting client connection: " + e.Message);
  35.         }
  36.     }
  37. }
  38. // Method to handle client communication
  39. List<byte> buffer = new List<byte>();
  40. void HandleClient(object clientObj)
  41. {
  42.     TcpClient client = (TcpClient)clientObj;
  43.     NetworkStream stream = client.GetStream();
  44.     byte[] tempBuffer = new byte[1024];
  45.   //  int bytesRead;
  46.    
  47.     while (isCliect)
  48.     {
  49.         try
  50.         {
  51.             int bytesRead = stream.Read(tempBuffer, 0, tempBuffer.Length);
  52.             buffer.AddRange(tempBuffer.Take(bytesRead));
  53.             if (buffer.Contains((byte)'\n'))
  54.             {
  55.                 byte[] completeData = buffer.ToArray();
  56.                 string message = Encoding.UTF8.GetString(completeData, 0, completeData.Length - 1); // 移除分隔符
  57.                 buffer.Clear(); // 清空缓冲区
  58.                 if (string.IsNullOrEmpty(message)) AcceptConnections();
  59.                 else
  60.                 {
  61.                     Debug.LogError(message);
  62.                     StreamingAssetsEnumerator.instances.play(message);
  63.                 }
  64.                 Debug.Log(message);       // 处理数据...
  65.             }
  66.             // Read data from the client
  67.            
  68.                
  69.             // 在这里处理接收到的消息并发送响应消息给客户端
  70.             // Perform action based on received data
  71.          
  72.             
  73.         }
  74.         catch (Exception e)
  75.         {
  76.             Debug.LogError("Error receiving data from client: " + e.Message);
  77.         }
  78.     }
  79.     client.Close();
  80. }
  81. public bool isCliect = false;
  82. // Method to stop the server
  83. void OnApplicationQuit()
  84. {
  85.     if (listener != null)
  86.     {
  87.         listener.Stop();
  88.         isCliect = false;
  89.     }
  90. }
复制代码
}

服务器端从streamingassets下读取图片或者视频需要插入插件UnityMainThreadDispatcher-master插件
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine.UI;
public class TCPClient : MonoBehaviour
{
// IP address and port of the server
public string serverIP; // Replace with the IP address of your computer
public int serverPort;
  1. // TCP client
  2. TcpClient client;
  3. NetworkStream stream;
  4. public Image signal;
  5. public Button Quit;
  6. // Start is called before the first frame update
  7. void Start()
  8. {
  9.     Quit.onClick.AddListener(() => QuitApp());
  10.     serverIP = IPReader.ipAddress;
  11.     serverPort = IPReader.port;
  12.     ConnectToServer();
  13.     //ContentServer();
  14.     // InvokeRepeating("Reconnect", 1f, 1f);
  15. }
  16. // Method to connect to the server
  17. void ContentServer()
  18. {
  19.     try
  20.     {
  21.         client = new TcpClient(serverIP, serverPort);
  22.         Debug.Log("连接成功!");
  23.         stream = client.GetStream();
  24.         signal.color = Color.green;
  25.         // 这里可以添加已连接的处理逻辑
  26.     }
  27.     catch (SocketException)
  28.     {
  29.         Debug.Log("连接失败!");
  30.         signal.color = Color.red;
  31.         // 处理连接失败的情况
  32.     }
  33. }
  34. void ConnectToServer()
  35. {
  36.     while (true)
  37.     {
  38.         try
  39.         {
  40.             client = new TcpClient();
  41.             client.Connect(serverIP, serverPort);
  42.             stream = client.GetStream();
  43.             Debug.Log("Connected to server.");
  44.             signal.color = Color.green;
  45.             // Start listening for incoming messages in a separate thread
  46.             Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
  47.             receiveThread.Start();
  48.             break; // Exit the loop once connected
  49.         }
  50.         catch (Exception e)
  51.         {
  52.             break;
  53.             Debug.LogError("Failed to connect to server: " + e.Message);
  54.             signal.color = Color.red;
  55.             Thread.Sleep(3000); // Wait for 3 seconds before attempting to reconnect
  56.         }
  57.     }
  58. }
  59. // Method to receive data from the server
  60. void ReceiveData()
  61. {
  62.     byte[] buffer = new byte[1024];
  63.     int bytesRead;
  64.     while (true)
  65.     {
  66.         try
  67.         {
  68.             // Read data from the server
  69.             bytesRead = stream.Read(buffer, 0, buffer.Length);
  70.             string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
  71.             Debug.LogError("Received data from server: " + receivedData);
  72.         }
  73.         catch (Exception e)
  74.         {
  75.             Debug.LogError("Error receiving data from server: " + e.Message);
  76.             break;
  77.         }
  78.     }
  79. }
  80. // Method to send data to the server
  81. public void SendData(byte[] data)
  82. {
  83.     if (stream == null || !client.Connected) ConnectToServer();
  84.     if (stream != null && client.Connected)
  85.     {
  86.         byte[] sendData = data;
  87.         stream.Write(sendData, 0, sendData.Length);
  88.         Debug.Log("Sent data to server: " + data);
  89.     }
  90. }
  91. // Clean up resources when the application quits
  92. void OnApplicationQuit()
  93. {
  94.     if (client != null && client.Connected)
  95.     {
  96.         client.Close();
  97.     }
  98. }
  99. public void QuitApp()
  100. {
复制代码
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
  1. }
复制代码
}

`

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表