Unity实现UDP客户端与服务器通信功能
前言
在Unity开发中,我们开发的程序经常需要和服务器或者其他的客户端进行通信,以便进行数据的传输。通信分好几种,比如TCP/IP,UDP,Socket等等。在之前的项目中,我做过一些使用UDP进行通信的项目。在这篇博客中我记录一下使用UDP实现一种最简单的客户端与服务器进行通信功能的流程。
实现步骤
1.在Unity项目中新建UDP通信脚本,代码如下所示:
using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Collections.Generic;
using UnityEngine.UI;
public class Udp : MonoBehaviour
{
//以下默认都是私有的成员
//Socket socketSend; //发送socket
UdpClient socketSend;
IPEndPoint ipSend; //客户端端口
Socket socketReceive; //接收socket
IPEndPoint ipReceive; //服务端端口
List<EndPoint> clientEnds; //客户端
string recvStr; //接收的字符串
string sendStr; //发送的字符串
byte[] recvData = new byte[1024]; //接收的数据,必须为字节
byte[] sendData = new byte[1024]; //发送的数据,必须为字节
int recvLen; //接收的数据长度
Thread connectThread; //连接线程
//输入框
public InputField thisField;
//初始化
void InitSocket()
{
//定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
ipSend = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 50000);
//ipSend = new IPEndPoint(IPAddress.Parse("192.168.1.200"),50000);
//定义套接字类型,在主线程中定义
socketSend = new UdpClient();
//定义服务端
//定义侦听端口,侦听任何IP
ipReceive = new IPEndPoint(IPAddress.Any, 0);
//定义套接字类型,在主线程中定义
socketReceive = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//服务端需要绑定ip
socketReceive.Bind(ipReceive);
//定义客户端
IPEndPoint senderReceive = new IPEndPoint(IPAddress.Any, 0);
clientEnds = new List<EndPoint>();
//开启一个线程连接,必须的,否则主线程卡死
connectThread = new Thread(new ThreadStart(SocketReceive));
connectThread.Start();
}
/// <summary>
/// UDP发送数据基本方法
/// </summary>
/// <param name="sendStr"></param>
void SocketSend(string sendStr)
{
//清空发送缓存
sendData = new byte[1024];
//数据类型转换
sendData = Encoding.UTF8.GetBytes(sendStr);
//发送给所有服务端
socketSend.Send(sendData, sendData.Length, ipSend);
}
/// <summary>
/// 发送数据
/// </summary>
public void ToSendString()
{
if (thisField.text != "")
{
SocketSend(thisField.text);
}
}
//服务器接收
void SocketReceive()
{
//进入接收循环
while (true)
{
//对data清零
recvData = new byte[1024];
//获取客户端,获取客户端数据,用引用给客户端赋值
EndPoint clientEnd = new IPEndPoint(IPAddress.Any, 0);
recvLen = socketReceive.ReceiveFrom(recvData, ref clientEnd);
clientEnds.Add(clientEnd);
print("message from: " + clientEnd.ToString()); //打印客户端信息
//输出接收到的数据
recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
}
}
//连接关闭
void SocketQuit()
{
//关闭线程
if (connectThread != null)
{
connectThread.Interrupt();
connectThread.Abort();
}
//最后关闭socket
if (socketReceive != null)
socketReceive.Close();
if (socketSend != null)
socketSend.Close();
}
// Use this for initialization
void Start()
{
InitSocket(); //在这里初始化
}
void OnApplicationQuit()
{
SocketQuit();
}
}
2.使用UGUI搭建一个InputField组件和button组件,如下图所示:
3.将udp.cs脚本拖拽到场景中的物体上,将InputField组件赋值到脚本上。
4.将udp发送字符串的方法赋值到按钮上,如下图所示:
5.打开网络调试工具,选择模拟服务端,将端口号改为和Unity相对应的端口号,如下图所示:
6.运行工程,在InputField组件中输入字符,点击发送按钮,可以看到服务端已经接收到了数据。
7.项目源码和网络模拟工具我也分享在下面:
项目源码
网络调试工具
视频讲解
版权声明:本文为qq_17367039原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。