【Unity】简单实现基于TCP的阻塞式Socket的文本消息通信

时间:2025-04-24 08:42:21

1.准备工具

  • Unity:用于建立客户端
  • Visual Studio:通过C#控制台建立服务端

2.建立服务端

在Visual Studio中创建一个C#控制台工程,粘贴下面的代码

using System;
using System.Net.Sockets;
using System.Net;
namespace ConsoleApp1
{

    internal class Program
    {
        static void Main(string[] args)
        {
            Socket mySocket;
            IPAddress ipAddr;
            IPEndPoint ipEp;
            int backLog = 0;
            //创建socket
            mySocket = new Socket(
                AddressFamily.InterNetwork,
                SocketType.Stream, //支持可靠、双向和基于连接的字节流
                ProtocolType.Tcp //使用“传输控制协议”
                );
            //将文本ip转换到ip地址类型,这里使用的是回环地址进行测试
            ipAddr = IPAddress.Parse("127.0.0.1");
            //绑定ip和端口,端口建议大于1500
            ipEp = new IPEndPoint(ipAddr, 8888);
            //绑定套接字
            mySocket.Bind(ipEp);
            //建立监听,但是这个是一个阻塞函数,因此不要在Unity里面跑,否则会卡死
            mySocket.Listen(backLog);
            while(true)
            {
                //定义一个新的Socket来接收消息
                Socket conn = mySocket.Accept();
                //创建一个缓存器,用于存储字节流消息
                byte[] readBuff = new byte[1024];
                //接收字节数组长度
                int count = conn.Receive(readBuff);
                //将字节数组转换为文本
                string message = System.Text.Encoding.UTF8.GetString(readBuff, 0, count);
                //创建服务端的消息回应文本
                string response = $"Hello from server {message}";
                //打印回应消息
                Console.WriteLine(response);
                //将消息回应文本转换为字节数组
                byte[] responseBytes = System.Text.Encoding.Default.GetBytes(response);
                //发送回应消息
                conn.Send(responseBytes);
            }
            mySocket.Close();
            Console.ReadKey();
        }
    }
}

3.建立客户端

在Unity中创建一个测试项目,搭建一个简单的UI,请看下面定义的UI变量需求。(这里我使用了TextMeshPro的UI类型,你可以修改为Unity旧版的UI变量类型)

创建一个C#脚本,取名为“Client”,将下面的代码粘贴,然后挂载到一个空物体上,将UI变量在Inspector窗口中进行赋值

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

public class Client : MonoBehaviour
{
    public TMP_InputField ipInput;
    public TMP_InputField messageInput;

    public Socket clientSocket;
    public IPAddress ipAddr;
    public IPEndPoint ipEp;
    
    /// <summary>
    /// 连接服务端
    /// 该函数请绑定一个“连接”按钮的点击事件
    /// 每次点击“发送”之前,请先点击“连接”按钮!!!
    /// </summary>
    public void Connect()
    {
        
        clientSocket = new Socket(
            AddressFamily.InterNetwork,
            SocketType.Stream, //支持可靠、双向和基于连接的字节流
            ProtocolType.Tcp //使用“传输控制协议”
        );
        //将文本ip转换到ip地址类型
        ipAddr = IPAddress.Parse("127.0.0.1");
        //绑定ip和端口
        ipEp = new IPEndPoint(ipAddr, 8888);
        //连接
        clientSocket.Connect(ipEp);
    }
    
    /// <summary>
    /// 发送消息
    /// 该函数请绑定一个“发送”按钮的点击事件
    /// 每次点击发送之前,请先点击“连接”按钮!!!
    /// </summary>
    public void SendMessage()
    {
        //将消息文本转换为字节数组
        byte[] responseBytes = System.Text.Encoding.Default.GetBytes(messageInput.text);
        //发送回应消息
        clientSocket.Send(responseBytes);
    }
}

4.测试项目

先在Visual Studio运行服务端程序(不要关闭),然后在Unity中运行客户端

在客户端中输入发送的消息,然后先点击“连接”按钮,再点击“发送按钮”,看看控制台程序是否有响应