一个比较简单的服务器和客户端在unity上运行的代码
服务端实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class fuwuduan : MonoBehaviour
{
Thread t;
bool accept= true;
// Start is called before the first frame update
void Start()
{
t = new Thread(socketServer);
t.IsBackground = true;
if (!t.IsAlive)
{
t.Start();
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown("a"))//关闭服务器
accept = false;
}
//接收消息
private void socketServer()
{
Debug.Log("创建socket服务端!");
//1,创建socket using System.Net.Sockets;
//AddressFamily.InterNetwork内网,SocketType.Stream以流来通信,第三个为协议
Socket tcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2,绑定服务器IP(计算机唯一标识)和端口号。端口号将通信数据给指定的软件。一个软件占用一个特定端口号(0-60000)
//查看本机IP:cmd-》ipconfig 本机局域网IP:198.168.1.2
//IPAddress ipAddress = new IPAddress(new byte[] { 192,168,1,2});
EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.124.20"), 8888);//IPEndPoint是对IP+端口号的一层封装
tcpSever.Bind(point);//向操作系统申请一个可用的IP和端口号做通信。绑定当前IP和端口号
do
{
//3.监听。等待客户端连接
tcpSever.Listen(100);//参数是最大连接数
Socket clientSocket = tcpSever.Accept();//暂停当前线程,直到一个客户端连接过来,之后进行下面的代码。返回的socket为客户端socket
//使用返回的socket跟客户端做通信
string message = "welcome!";
Debug.Log(message);
byte[] meg = Encoding.UTF8.GetBytes(message);//对字符串编码,得带一个字节数组
clientSocket.Send(meg);
//接受客户端数据
byte[] buffer = new byte[1024];
int length = clientSocket.Receive(buffer);//接受客户端数据
string mes = Encoding.UTF8.GetString(buffer, 0, length);
Debug.Log("服务端收到:" + mes);
} while (accept);
//关闭服务器
tcpSever.Close();
}
void OnDestroy()
{
closeT();
}
void closeT()
{
if (t.IsAlive)
{
t.Abort();
Debug.Log("关闭线程");
}
}
}
客户端实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class kehuduan : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//发送消息
if(Input.GetKeyDown("s"))
socketClient("早上好");
}
private void socketClient(string msg)
{
Debug. Log("创建socket客户端!");
//创建socket
Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//发起连接请求
EndPoint remoteIp = new IPEndPoint(IPAddress.Parse("192.168.124.20"), 8888);
tcpClient.Connect(remoteIp);//连接远程已经绑定IP和端口号的服务器端。已连接远程主机。
//从远程主机接受数据并显示在客户端
byte[] buffer = new byte[1024];
int byteNum = tcpClient.Receive(buffer);//将接受到的数据,存入buffer。返回值为接受到的字节数
string message = Encoding.UTF8.GetString(buffer, 0, byteNum);//将接受到的数据,转化为字符串
Debug.Log("客户端收到:" + message);
//发送给服务器
string clientToSeverMes = msg;
byte[] cts = Encoding.UTF8.GetBytes(clientToSeverMes);
tcpClient.SendTo(cts, remoteIp);
}
}
然后创建一个空物体附加上两个脚本
按s发送客户端数据就可以看到服务端接收到客户端消息并且返回数据
需要注意的是我服务端Accept()时会暂停线程所以必须要用线程来运行,在主线程运行会卡死
客户端如果接收不到数据也会卡顿,建议也创建线程运行