您现在的位置是:首页 >其他 >UNITY 2022 TCP客户端教程网站首页其他
UNITY 2022 TCP客户端教程
简介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程序。然后通讯猫里点击发送一段字符。可得到下图。
程序里默认是收到后显示在页面上,同时把收到的数据原样回发给服务器端。
代码有点大,就不上传了。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。