Unity 网络 之 TcpListener 实现简单的网络服务器和客户端通讯功能封装(可监听多个客户端)

本文介绍在Unity中使用TcpListener创建可监听多个客户端的网络服务器,涉及异步处理和多线程,提供关键代码及封装后的函数接口,如连接、断开、发送消息等。
摘要由CSDN通过智能技术生成

 

 

Unity 网络 之 TcpListener 实现简单的网络服务器和客户端通讯功能封装(可监听多个客户端)

 

目录

Unity 网络 之 TcpListener 实现简单的网络服务器和客户端通讯功能封装(可监听多个客户端)

一、简单介绍

二、实现原理

三、简单功能说明图

四、注意实现

五、效果预览

六、封装后主要几个函数接口

七、关键代码

八、参考工程


 

一、简单介绍

Unity 中网络通讯知识的整理。

本节介绍,在Unity中用 TcpClient、TcpListener 两个封装类和 NetworkStream 来实现一个简单的网络通讯 demo。

涉及到异步处理,和多线程使用,因为是简单的封装,基本通讯可以满足使用,仅供参考,若有不对,请指出哈,谢谢。

 

二、实现原理

1、首先通过 IP 和 端口号,开启服务器监听

2、在客户端连接进入之后,会开启一个线程维持与该客户端的通讯,处理该客户端的消息

3、在异步开启一个监听,继续监听客户端接入,如此反复,实现无限(理论上)监听

4、客户端连接服务器,然后开线程,维持与该服务器的通讯,处理服务器的消息

 

三、简单功能说明图

 

四、注意实现

1、因为是多线程,在Unity中,要注意有些组件只能在主线程中使用,同时可能要考虑一些资源要加锁处理

2、开启网络,如果服务器没有开启,第一个客户端会开启服务器功能

3、同一个Ip和Port,之后连接进来的对后市客户端

 

五、效果预览

 

六、封装后主要几个函数接口

1、连接网络,开启服务器或者客户端连接,可以添加事件

TcpNetConnect(string IP, int port, Action action = null)

 

2、断开网络,关闭服务器,或关闭客户端连接

TcpNetDisconnect()

 

3、发送消息

SendMsg(string msg)

 

4、设置连接网络成功的回调事件

SetNetStartEvent(Action<string> action)

 

5、设置网络通讯中日志的回调事件

SetNetLogEvent(Action<string> action)

 

6、设置接收到客户端或者服务器消息的回调事件

SetNetRecieveMsgEvent(Action<string> action)

 

7、设置断开网络的回调事件(本段可能看不到消息)

SetNetCloseEvent(Action<string> action)

 

七、关键代码

1、TcpNet.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace TcpNetMultiplt
{
    [RequireComponent(typeof(TcpClientManager), typeof(TcpServerManager))]
    public class TcpNet : MonoBehaviour
    {
        TcpClientManager tcpClient = null;
        TcpServerManager tcpServer = null;
        bool isServer = false;
        Action AddEventListern;

        public bool IsServer { get => isServer; set => isServer = value; }

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

        }


        public void TcpNetConnect(string IP, int port, Action action = null)
        {


            AddEventListern = action;
            tcpClient = GetComponent<TcpClientManager>();
            if (AddEventListern != null)
            {

                Debug.Log("AddEventListern");
                AddEventListern();
            }
            tcpClient.SetTcpClientManager(IP, port);

            if (!tcpClient.StartNet())
            {
                tcpClient.Close();
                tcpClient = null;
                tcpServer = GetComponent<TcpServerManager>();
                if (AddEventListern != null)
                {

                    Debug.Log("AddEventListern");
                    AddEventListern();
                }
                tcpServer.SetTcpServerManager(IP, port);
                tcpServer.StartNet();
                isServer = true;
            }
            else
            {
                isServer = false;
            }


        }


        p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值