using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using System.Net; using System.Threading; using UnityEngine; using System.Text; public class UdpConnect : MonoBehaviour { public string editString = "hello wolrd"; //编辑框文字 //以下默认都是私有的成员 private Socket socket; //目标socket private EndPoint serverEnd; //服务端 private IPEndPoint ipEnd; //服务端端口 private string recvStr; //接收的字符串 private string sendStr; //发送的字符串 private byte[] recvData = new byte[1024]; //接收的数据,必须为字节 private byte[] sendData = new byte[1024]; //发送的数据,必须为字节 private int recvLen; //接收的数据长度 private Thread connectThread; //连接线程 void InitSocket() { //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网 ipEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999); //定义套接字类型,在主线程中定义 socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //定义服务端 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); serverEnd = (EndPoint)sender; print("waiting for sending UDP dgram"); //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息 SocketSend("hello"); //开启一个线程连接,必须的,否则主线程卡死 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, ipEnd); } void SocketReceive() { //进入接收循环 while (true) { //对data清零 recvData = new byte[1024]; //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值 recvLen = socket.ReceiveFrom(recvData, ref serverEnd); print("message from: " + serverEnd.ToString()); //打印服务端信息 //输出接收到的数据 recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen); print("我是客户端,接收到服务器的数据" + recvStr); } } void SocketQuit() { //关闭线程 if (connectThread != null) { connectThread.Interrupt(); connectThread.Abort(); } //最后关闭socket if (socket != null) socket.Close(); } private void OnApplicationQuit() { SocketQuit(); } }