【Unity】简单实现基于TCP的阻塞式Socket的文本消息通信
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;//创建socketmySocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, //支持可靠、双向和基于连接的字节流ProtocolType.Tcp //使用“传输控制协议”);//将文本ip转换到ip地址类型,这里使用的是回环地址进行测试ipAddr = IPAddress.Parse("127.0.0.1");//绑定ip和端口,端口建议大于1500ipEp = 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中运行客户端
在客户端中输入发送的消息,然后先点击“连接”按钮,再点击“发送按钮”,看看控制台程序是否有响应