tcp局域网简单通讯

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;

复制代码
// TCP listener
TcpListener listener;

//public Test Test;

// Start is called before the first frame update
void Start()
{

// Test = GetComponent();

StartServer();

// PlayVideo("初始场景");

}

复制代码
// Method to start the TCP server
void StartServer()
{
    try
    {
        listener = new TcpListener(IPAddress.Any, serverPort);
        listener.Start();
        Debug.Log("Server started, listening on port " + serverPort);
        isCliect = true;

        // Start accepting incoming connections in a separate thread
        Thread acceptThread = new Thread(new ThreadStart(AcceptConnections));
        acceptThread.Start();
    }
    catch (Exception e)
    {
      //  Debug.LogError("Failed to start server: " + e.Message);
    }
}

// Method to accept incoming connections
void AcceptConnections()
{
    while (true)
    {
        try
        {
            TcpClient client = listener.AcceptTcpClient();
            Debug.Log("Client connected: " + ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString());

            // Handle client communication in a separate thread
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
            clientThread.Start(client);
        }
        catch (Exception e)
        {
            //Debug.LogError("Error accepting client connection: " + e.Message);
        }
    }
}

// Method to handle client communication
List<byte> buffer = new List<byte>();
void HandleClient(object clientObj)
{

    TcpClient client = (TcpClient)clientObj;
    NetworkStream stream = client.GetStream();

    byte[] tempBuffer = new byte[1024];
  //  int bytesRead;
    
    while (isCliect)
    {
        try
        {
            int bytesRead = stream.Read(tempBuffer, 0, tempBuffer.Length);
            buffer.AddRange(tempBuffer.Take(bytesRead));
            if (buffer.Contains((byte)'\n'))
            {
                byte[] completeData = buffer.ToArray();
                string message = Encoding.UTF8.GetString(completeData, 0, completeData.Length - 1); // 移除分隔符
                buffer.Clear(); // 清空缓冲区
                if (string.IsNullOrEmpty(message)) AcceptConnections();
                else
                {
                    Debug.LogError(message);
                    StreamingAssetsEnumerator.instances.play(message);
                }
                Debug.Log(message);       // 处理数据...
            }
            // Read data from the client
           
                

            // 在这里处理接收到的消息并发送响应消息给客户端
            // Perform action based on received data


          

            
        }
        catch (Exception e)
        {
            Debug.LogError("Error receiving data from client: " + e.Message);
        }
    }

    client.Close();
}

public bool isCliect = false;
// Method to stop the server
void OnApplicationQuit()
{
    if (listener != null)
    {
        listener.Stop();
        isCliect = false;
    }
}

}

服务器端从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;

复制代码
// TCP client
TcpClient client;
NetworkStream stream;

public Image signal;



public Button Quit;
// Start is called before the first frame update
void Start()
{
    Quit.onClick.AddListener(() => QuitApp());

    serverIP = IPReader.ipAddress;
    serverPort = IPReader.port;
    ConnectToServer();
    //ContentServer();
    // InvokeRepeating("Reconnect", 1f, 1f);
}

// Method to connect to the server



void ContentServer()
{
    try
    {
        client = new TcpClient(serverIP, serverPort);
        Debug.Log("连接成功!");
        stream = client.GetStream();
        signal.color = Color.green;
        // 这里可以添加已连接的处理逻辑
    }
    catch (SocketException)
    {
        Debug.Log("连接失败!");
        signal.color = Color.red;
        // 处理连接失败的情况
    }

}





void ConnectToServer()
{

    while (true)
    {
        try
        {
            client = new TcpClient();
            client.Connect(serverIP, serverPort);
            stream = client.GetStream();
            Debug.Log("Connected to server.");

            signal.color = Color.green;
            // Start listening for incoming messages in a separate thread
            Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
            receiveThread.Start();
            break; // Exit the loop once connected
        }
        catch (Exception e)
        {
            break;
            Debug.LogError("Failed to connect to server: " + e.Message);
            signal.color = Color.red;

            Thread.Sleep(3000); // Wait for 3 seconds before attempting to reconnect
        }
    }
}

// Method to receive data from the server
void ReceiveData()
{
    byte[] buffer = new byte[1024];
    int bytesRead;

    while (true)
    {
        try
        {
            // Read data from the server
            bytesRead = stream.Read(buffer, 0, buffer.Length);
            string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Debug.LogError("Received data from server: " + receivedData);
        }
        catch (Exception e)
        {
            Debug.LogError("Error receiving data from server: " + e.Message);
            break;
        }
    }
}


// Method to send data to the server
public void SendData(byte[] data)
{

    if (stream == null || !client.Connected) ConnectToServer();
    if (stream != null && client.Connected)
    {
        byte[] sendData = data;
        stream.Write(sendData, 0, sendData.Length);
        Debug.Log("Sent data to server: " + data);
    }
}

// Clean up resources when the application quits
void OnApplicationQuit()
{
    if (client != null && client.Connected)
    {
        client.Close();
    }
}


public void QuitApp()
{

#if UNITY_EDITOR

UnityEditor.EditorApplication.isPlaying = false;

#else

Application.Quit();

#endif

复制代码
}

}

`

相关推荐
@insist12310 分钟前
信息安全-防火墙技术演进全景:从代理NAT 到下一代及专项防火墙
网络·安全·web安全·软考·信息安全工程师·软件水平考试
优化Henry15 分钟前
TDD-LTE站点Rilink=3链路故障处理案例---BBU侧C口“有发光、无收光”的排查与恢复
运维·网络·信息与通信·tdd
浪客灿心16 分钟前
Linux网络传输层协议
linux·运维·网络
段一凡-华北理工大学2 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章06:智能决策:从经验驱动到数据驱动
网络·人工智能·数据挖掘·高炉炼铁·工业智能体·高炉炉温
时空系3 小时前
第7篇:功能——打造你的工具箱 Rust中文编程
开发语言·网络·rust
BizViewStudio4 小时前
甄选方法:2026 企业新媒体代运营的短视频精细化运营与流量转化技巧
大数据·网络·人工智能·媒体
凯瑟琳.奥古斯特4 小时前
NAT原理及作用详解
网络·网络协议
网络工程小王4 小时前
【企业中小型网络架构设计】
网络
七夜zippoe5 小时前
OpenClaw Skills 高级开发指南
服务器·网络·人工智能·skills·openclaw
想唱rap5 小时前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法