Unity C# tcpserver

文章介绍了如何在Unity中使用SingletonBase创建一个简易的TcpServer类,实现监听客户端连接,进行数据交换,并通过多线程处理客户端请求。
摘要由CSDN通过智能技术生成

简易tcpserver拷贝即用:
SingletonBase看这里Unity实用单例 and MonoBehaviour单例-CSDN博客

using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;

public class TcpServer : SingletonBase<TcpServer>
{
    private TcpListener _tcpListener;
    private TcpClient _tcpClient;
    private Thread _listenerThread;
    Thread _clientThread;
    public void StartServer()
    {
        if (_tcpListener != null)
        {
            return;
        }
        _tcpListener = new TcpListener(IPAddress.Any, 9786);
        _listenerThread = new Thread(new ThreadStart(ListenForClients));
        _listenerThread.Start();
    }

    public void StopServer()
    {
        if(_listenerThread != null)_listenerThread.Abort();
        if(_clientThread != null)_clientThread.Abort();
        if(_tcpListener != null)_tcpListener.Stop();

        _tcpListener = null;
        _listenerThread = null;
        _clientThread = null;
    }

    private void ListenForClients()
    {
        _tcpListener.Start();
        Debug.Log("ListenForClients");
        while (true)
        {
            // 等待客户端连接
            _tcpClient = _tcpListener.AcceptTcpClient();
            if (_tcpClient!= null)
            {
                Debug.Log("new   clientThread ");
                // 开启新线程处理客户端
                if (_clientThread != null) _clientThread.Abort();
                _clientThread = new Thread(ClientConnect);
                _clientThread.Start(_tcpClient);
            }
        }
    }

    private void ClientConnect(object clientObj)
    {
        TcpClient tcpClient = (TcpClient)clientObj;
        NetworkStream clientStream = tcpClient.GetStream();
        byte[] messageBuffer = new byte[1024]; 

        while (true)
        {
            int bytesRead = clientStream.Read(messageBuffer, 0, messageBuffer.Length);
            if (bytesRead == 0)
            {
                // 客户端断开连接
                break;
            }
            string receivedData = Encoding.ASCII.GetString(messageBuffer, 0, bytesRead);
            Debug.Log("receivedData = " + receivedData);

            if (receivedData == "1001")
            {
                Debug.Log("start doing ...");
            }
            else if (receivedData == "1002")
            {
                Debug.Log("stop ");
            }
        }
        tcpClient.Close();
    }
}

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值