赞
踩
客户端脚本:
using UnityEngine; using System.Collections; //引入库 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine.UI; public class UDPClient : MonoBehaviour { public static UDPClient instance; private void Awake() { instance = this; } string editString = "hello wolrd"; //编辑框文字 //以下默认都是私有的成员 Socket socket; //目标socket EndPoint serverEnd; //服务端 IPEndPoint ipEnd; //服务端端口 string recvStr; //接收的字符串 string sendStr; //发送的字符串 byte[] recvData = new byte[1024]; //接收的数据,必须为字节 byte[] sendData = new byte[1024]; //发送的数据,必须为字节 int recvLen; //接收的数据长度 Thread connectThread; //连接线程 public string ip="127.0.0.1"; public int port=8001; public Button _btn; // Use this for initialization void Start() { InitSocket(); //在这里初始化 _btn.onClick.AddListener(()=> { SocketSend("UDP Message"); }); } //初始化 void InitSocket() { //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网 ipEnd = new IPEndPoint(IPAddress.Parse(ip), port); //192.168.1.83 2100 //定义套接字类型,在主线程中定义 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //定义服务端 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); serverEnd = (EndPoint)sender; SocketSend("hello"); //开启一个线程连接,必须的,否则主线程卡死 connectThread = new Thread(new ThreadStart(SocketReceive)); connectThread.Start(); } public void SocketSend(string sendStr) { //清空发送缓存 sendData = new byte[1024]; //数据类型转换 sendData = Encoding.ASCII.GetBytes(sendStr); //发送给指定服务端 socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd); } //服务器接收 void SocketReceive() { //进入接收循环 while (true) { //对data清零 recvData = new byte[1024]; //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值 recvLen = socket.ReceiveFrom(recvData, ref serverEnd); //输出接收到的数据 if (recvLen>0) { recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen); print(recvStr); } } } //连接关闭 void SocketQuit() { //关闭线程 if (connectThread != null) { connectThread.Interrupt(); connectThread.Abort(); } //最后关闭socket if (socket != null) socket.Close(); } void OnApplicationQuit() { SocketQuit(); } }
服务器端脚本:
using UnityEngine; using System.Collections; //引入库 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine.UI; public class UdpServer : MonoBehaviour { //以下默认都是私有的成员 Socket socket; //目标socket EndPoint clientEnd; //客户端 IPEndPoint ipEnd; //侦听端口 string recvStr; //接收的字符串 string sendStr; //发送的字符串 byte[] recvData = new byte[1024]; //接收的数据,必须为字节 byte[] sendData = new byte[1024]; //发送的数据,必须为字节 int recvLen; //接收的数据长度 Thread connectThread; //连接线程 bool isGetstr=false; public Text text; void Start() { InitSocket(); //在这里初始化server } //初始化 void InitSocket() { //定义侦听端口,侦听任何IP ipEnd = new IPEndPoint(IPAddress.Any, 8001); //定义套接字类型,在主线程中定义 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //服务端需要绑定ip socket.Bind(ipEnd); //定义客户端 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); clientEnd = (EndPoint)sender; print("waiting for UDP dgram"); //开启一个线程连接,必须的,否则主线程卡死 connectThread = new Thread(new ThreadStart(SocketReceive)); connectThread.Start(); } void SocketSend(string sendStr) { //清空发送缓存 sendData = new byte[1024]; //数据类型转换 sendData = Encoding.ASCII.GetBytes(sendStr); //发送给指定客户端 socket.SendTo(sendData, sendData.Length, SocketFlags.None, clientEnd); } //服务器接收 void SocketReceive() { //进入接收循环 while (true) { //对data清零 recvData = new byte[1024]; //获取客户端,获取客户端数据,用引用给客户端赋值 recvLen = socket.ReceiveFrom(recvData, ref clientEnd); print("message from: " + clientEnd.ToString()); //打印客户端信息 //输出接收到的数据 recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen); if (recvStr.Length>=1) { print(recvStr); isGetstr = true; } } } //连接关闭 void SocketQuit() { //关闭线程 if (connectThread != null) { connectThread.Interrupt(); connectThread.Abort(); } //最后关闭socket if (socket != null) socket.Close(); print("disconnect"); } void Update() { if (isGetstr) { isGetstr = false; text.text = recvStr; } } void OnApplicationQuit() { SocketQuit(); } }
演示效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。