您现在的位置是:首页 >其他 >UNITY 2022 TCP客户端教程网站首页其他

UNITY 2022 TCP客户端教程

骑着毛驴数星星 2025-03-27 12:01:01
简介UNITY 2022 TCP客户端教程

概述:

        通过UNITY写一个TCP客户端,功能是收到后显示在页面上,同时把收到的数据原样回发给服务器端。 另外调试窗口打印收到数据的长度。

        使用通讯猫作为TCP服务器端与UNITY进行联调。

1.首先新建一个工程

2.工程里放一个旧文本。

        并调整位置、字体、宽度、高度等,

        文本默认信息输入:接收数据如下:(回车)

3.在场景Canvas的属性里添加一个脚本

        脚本名称为tcp test。脚本里输入以下代码并保存:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEditor.PackageManager;
using UnityEngine;
using UnityEngine.UI;

public class TCPtest : MonoBehaviour
{
    public string ipAddress;
    public int port;
    private bool isConnected;
    private Thread connectThread;
    private Thread readDataThread;
    private TcpClient tcpClient;
    private NetworkStream stream;
    //将数据存于队列 依次取出
    private Queue<string> queue = new Queue<string>();

    public Text disText;

    private void Start()
    {
        connectThread = new Thread(ConnectThead);
        connectThread.Start();
    }
    //连接线程
    private void ConnectThead()
    {
        tcpClient = new TcpClient();
        tcpClient.BeginConnect(ipAddress, port, ConnectThreadCallBack, tcpClient);
        float waitTime = 0f;
        while (!isConnected)
        {
            Thread.Sleep(500);
            //waitTime += Time.deltaTime;
            waitTime += 0.5f;
            if (waitTime > 3f)
            {
                waitTime = 0f;
                throw new Exception("连接超时");
            }
        }

        //int threadId = Thread.CurrentThread.ManagedThreadId;
        //Debug.Log("connect Thread ID: " + threadId);
    }

    private void ConnectThreadCallBack(IAsyncResult result)
    {
        tcpClient = result.AsyncState as TcpClient;
        if (tcpClient.Connected)
        {
            isConnected = true;
            tcpClient.EndConnect(result);
            stream = tcpClient.GetStream();
            readDataThread = new Thread(ReadDataThread);
            readDataThread.Start();
        }
    }
    //读取数据线程
    private void ReadDataThread()
    {
        //int threadId = Thread.CurrentThread.ManagedThreadId;
        //Debug.Log("rx Thread ID: " + threadId);

        try
        {
            while (isConnected)
            {
                byte[] buffer = new byte[1024];
                int length = stream.Read(buffer, 0, buffer.Length);
                if (length > 0)
                {
                    Debug.Log("lenth:"+length);
                }
                string data = Encoding.UTF8.GetString(buffer, 0, length);
                queue.Enqueue(data);
                

            }
        }
        catch (Exception error)
        {           
            //Debug.LogError(error);
            Debug.Log(error);
            //throw new Exception(error.ToString());
        }
    }
    //程序退出时关闭线程
    private void OnApplicationQuit()
    {
        stream?.Close();
        connectThread?.Abort();
        readDataThread?.Abort();
    }

    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="content"></param>
    public void SendData(string content)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(content);
        stream.Write(buffer, 0, buffer.Length);
    }

    private void Update()
    {
        //int threadId = Thread.CurrentThread.ManagedThreadId;
        //Debug.Log("main Thread ID: " + threadId);
        if (queue.Count > 0)
        {
            string rx_data = queue.Dequeue();
            disText.text += rx_data + "
";
            SendData(rx_data);
        }
        
    }
}

4.在Canvas属性中设置脚本的参数

        IP根据自己电脑的ip设置,可以在命令提示符里输入IPCONFIG得到。

        端口设置为6000即可,这个随意,要跟服务器端对应。

        然后把Text部件拽到DisText参数框里。

        

5.使用调试助手开启服务器端

        我这里使用的通讯猫,注意端口与UNITY一致。

        先开启服务器端,然后运行UNITY程序。然后通讯猫里点击发送一段字符。可得到下图。

        程序里默认是收到后显示在页面上,同时把收到的数据原样回发给服务器端。

    

代码有点大,就不上传了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。