Unity UDP通讯
UDP的特点:随时断开,随时连接。
(客户端与服务器没有区别)
服务器
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class UDPServer : MonoBehaviour {
IPEndPoint ServerIpEndPoint;
IPEndPoint ClientIpEndPoint;
Socket socket;
Thread serverThread;
// Use this for initialization
void Start () {
Init();
}
// Update is called once per frame
void Update () {
}
void Init() {
//服务器ip地址
ServerIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),11000);
//客户端地址
ClientIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11001);
//定义套接字
socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//绑定ip地址
socket.Bind(ServerIpEndPoint);
//开启接收消息的线程
serverThread = new Thread(Recv);
serverThread.Start();
}
public void Recv() {
//接收所有地址来的信息
EndPoint endPoint = new IPEndPoint(IPAddress.Any,0);
while (true)
{
byte[] recvData = new byte[1024];
int recvLen = socket.ReceiveFrom(recvData, ref endPoint);
string str = Encoding.UTF8.GetString(recvData, 0,recvLen);
print(str);
}
}
public void Send(string str) {
byte[] sendData = new byte[1024];
sendData = Encoding.UTF8.GetBytes(str);
//发送给目标端口消息
socket.SendTo(sendData,sendData.Length, SocketFlags.None, ClientIpEndPoint);
}
private void OnApplicationQuit()
{
//结束游戏关掉线程,如果不关闭程序会卡死
if (socket!=null)
{
socket.Close();
}
if (serverThread!=null)
{
serverThread.Interrupt();
serverThread.Abort();
}
}
}
客户端
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class UDPClient : MonoBehaviour
{
IPEndPoint ClientIpEndPoint;
IPEndPoint ServerIpEndPoint;
Socket socket;
Thread serverThread;
// Use this for initialization
void Start()
{
Init();
}
// Update is called once per frame
void Update()
{
}
void Init()
{
//客户端IP地址
ClientIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11001);
//服务器地址
ServerIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
//定义套接字
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定ip地址
socket.Bind(ClientIpEndPoint);
//开启接收线程
serverThread = new Thread(Recv);
serverThread.Start();
}
public void Recv()
{
EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byte[] recvData = new byte[1024];
int recvLen = socket.ReceiveFrom(recvData, ref endPoint);
string str = Encoding.UTF8.GetString(recvData, 0, recvLen);
print(str);
}
}
public void Send(string str)
{
byte[] sendData = new byte[1024];
sendData = Encoding.UTF8.GetBytes(str);
socket.SendTo(sendData, sendData.Length, SocketFlags.None, ServerIpEndPoint);
}
private void OnApplicationQuit()
{
//结束游戏关掉线程,如果不关闭程序会卡死
if (socket != null)
{
socket.Close();
}
if (serverThread != null)
{
serverThread.Interrupt();
serverThread.Abort();
}
}
}