实现客户端的网络不影响主线程且随时与服务器通信

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
//网络管理器(单例模式)
public class NetMgr : MonoBehaviour
{
    private static NetMgr instance;

    //用于发送消息的队列 公共容器 主线程往里边放 发送线程从里边取
    private Queue<string> sendMgsQueue = new Queue<string>();
    //用于接收消息的队列 公共容器 存放线程往里放 主线程从里边取
    private Queue<string> receiveMgsQueue = new Queue<string>(); 
    public static NetMgr Instance => instance;
    //用于收消息的水桶(容器)
    private byte[] bytes = new byte[1024 * 1024];
    //用于返回字节数组大小
    private int receiveNum;
    //客户端Socket
    public Socket socket;
    private bool IsConnect=false;

    void Awake()
    {
        instance = this;    
    }
    void Update()
    {
        if(receiveMgsQueue .Count >0)
        {
            print(receiveMgsQueue.Dequeue());
        }
    }
    //连接服务器
    public void Connect(string ip,int port)
    {//如果是非链接状态,直接返回
        if (IsConnect )
            return;
        if(socket==null)
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //连接服务端
        IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(ip),port);
        try
        {
            socket.Connect(ipPoint);
            IsConnect  = true;
            //使用线程池节约性能
            ThreadPool.QueueUserWorkItem(SendMsg);
            ThreadPool.QueueUserWorkItem(ReceiveMsg);
        }
        catch (SocketException e)
        {
            if (e.ErrorCode == 10061)
                print("服务器拒绝连接");
            else
                print("连接失败" + e.ErrorCode + e.Message);
        }
    
    }
    //发送消息
    public void Send(string info)
    {
        sendMgsQueue.Enqueue(info);
    }
    public void SendMsg(object obj)
    {
        if(sendMgsQueue .Count >0)
        {
            socket.Send(Encoding.UTF8.GetBytes(sendMgsQueue.Dequeue()));
        }
    }
    //不停的接收消息
    public void ReceiveMsg(object obj)
    {
        while (IsConnect)
        {
            if (socket.Available > 0)
            {
                receiveNum = socket.Receive(bytes);
                //解析字符数组成字符串,放入公共容器中
                receiveMgsQueue.Enqueue(Encoding.UTF8.GetString(bytes, 0, receiveNum));
            }
        }
 
    }
    public void Close()
    {
        if(socket !=null)
        {
            IsConnect  = false;
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }
    private void OnDestroy()
    {
        Close();
    }
}

主函数入口

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Main : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        if(NetMgr .Instance ==null)
        {
            GameObject obj = new GameObject("Net");
            obj.AddComponent<NetMgr>();
        }
        NetMgr.Instance.Connect("127.0.0.1", 8080);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

客户端向服务器发消息

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Lesson7 : MonoBehaviour
{
    public Button btu;
    public InputField input;
    void Start()
    {
        btu.onClick.AddListener(() =>
      {
          if (input.text != "")
          {
              NetMgr.Instance.Send(input.text);
          }
      }
        );
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
相关推荐
qq_452396236 小时前
【AI 架构师】第十篇:Agent 工业化部署 —— 从 FastAPI 到云端全链路监控
网络·人工智能·ai·fastapi
globaldomain6 小时前
什么是用于长距离高速传输的TCP窗口扩展?
开发语言·网络·php
桌面运维家8 小时前
Win10打印机共享故障排查:权限与网络配置详解
开发语言·网络·php
众创五舟战神:l_e01208 小时前
shopee(虾皮)买家号系统搭建:安全下单攻略
网络·安全
中议视控8 小时前
RTSP和RTSM编码推送软件让中控系统控制实现可视化播控
网络·分布式·物联网·5g·音视频
mxwin9 小时前
Unity Shader SRP深入理解内置渲染管线与 URP/HDRP 的底层架构差异
unity·游戏引擎·单一职责原则
线束线缆组件品替网11 小时前
Amphenol RJE1Y22A53644401线束详解与替代网络线束选型指南
运维·服务器·网络·智能路由器·电脑·51单片机
Du_chong_huan11 小时前
3.2 无连接运输:UDP 协议|《计算机网络:自顶向下方法》精读
网络协议·计算机网络·udp
SeanDe11 小时前
Linux grep 命令用法详解
linux·服务器·网络
志栋智能13 小时前
告别高昂投入:超自动化IT运维的轻量化实践
大数据·运维·网络·人工智能·自动化