用UDP进行广播后绑定发送Json数据进行通讯
2017-07-19 16:28
627 查看
不只局限于Unity与Unity 之间的通讯。
用UDP通讯,要绑定服务器的IP以及端口号,同样服务器也要知道它的信息要发给谁,所以客户端要将自己的IP以及端口号发送给服务器,以便服务器直接发送数据到该客户端。
可能遇到的问题:
1.服务器接收到信息后,发送信息,客户端接收不到,用抓包工具进行检测的时候,发现客户端的端口号一直在更改。
端口号不断更改是正常的。服务器只需要处理只要是从该客户端IP发从过来的信息就可以,不用管端口号改成了什么。服务器与客户端发送信息时,端口号要按规定的发送,并且服务器与客户端要严格按照规定的协议进行发送信息。
2.处理Json信息的时候,Json数据接收后,在处理时发现处理到某个数据就不再继续处理,处理中断。
Json数据处理的时候数据类型有:string,int,bool,double,如果你用float类型接收数据,就会处理出错,导致处理中断。
3.调用数据的时候,不要在次线程中调用数据。要将数据保存,由主线程去调用或者设置场景中的一些信息。
发送的Json数据是集合中存在集合的情况,不同的Json数据,定义的方式不同。
代码如下:
用UDP通讯,要绑定服务器的IP以及端口号,同样服务器也要知道它的信息要发给谁,所以客户端要将自己的IP以及端口号发送给服务器,以便服务器直接发送数据到该客户端。
可能遇到的问题:
1.服务器接收到信息后,发送信息,客户端接收不到,用抓包工具进行检测的时候,发现客户端的端口号一直在更改。
端口号不断更改是正常的。服务器只需要处理只要是从该客户端IP发从过来的信息就可以,不用管端口号改成了什么。服务器与客户端发送信息时,端口号要按规定的发送,并且服务器与客户端要严格按照规定的协议进行发送信息。
2.处理Json信息的时候,Json数据接收后,在处理时发现处理到某个数据就不再继续处理,处理中断。
Json数据处理的时候数据类型有:string,int,bool,double,如果你用float类型接收数据,就会处理出错,导致处理中断。
3.调用数据的时候,不要在次线程中调用数据。要将数据保存,由主线程去调用或者设置场景中的一些信息。
发送的Json数据是集合中存在集合的情况,不同的Json数据,定义的方式不同。
代码如下:
using UnityEngine; using System.Collections; using System.Net; using System.Net.Sockets; using System.Text; using System; using System.Threading; //using TestBridge; using System.Runtime.InteropServices; using LitJson; using System.Collections.Generic; struct I { public string IP; public int deviceId; } public class udpServer : MonoBehaviour { private static udpServer _instance; public static udpServer Instance { get { return _instance; } } //IPEndPoint ipsend; //private Socket sendsock; private Socket newsock; IPEndPoint ip; int recv; byte[] data = new byte[1024]; string mydata; public string sendipaddress = ""; public string benjiIp = ""; public int sendport = 0000; public int receiveport = 0001; Socket server; IPEndPoint sender; private Hashtable ZhaoHuList = new Hashtable(); private Hashtable ZhaoHuBodyList = new Hashtable(); private I bangDingIP; void Awake() { _instance = this; } void Start() { try { string HostName = Dns.GetHostName(); //得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); for (int i = 0; i < IpEntry.AddressList.Length; i++) { //从IP地址列表中筛选出IPv4类型的IP地址 //AddressFamily.InterNetwork表示此IP为IPv4, //AddressFamily.InterNetworkV6表示此地址为IPv6类型 if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) { benjiIp = IpEntry.AddressList[i].ToString(); } } } catch (Exception ex) { } string[] fenduanIP = benjiIp.Split('.'); sendipaddress = fenduanIP[0] + "." + fenduanIP[1] + "." + fenduanIP[2] + "." + "255"; server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sender = new IPEndPoint(IPAddress.Parse(sendipaddress), sendport); //得到本机IP,设置TCP端口号 ip = new IPEndPoint(IPAddress.Parse(benjiIp), receiveport);//设置自身的IP和端口号,在这里IPAddress.Any是自动获取本机IP newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); newsock.Bind(ip);//绑定IP Thread test = new Thread(BeginListening);//定义一个子线程 test.Start();//子线程开始 9bc2 string ipString = ip.Address.ToString(); ZhaoHuBodyList.Add("deviceId", 2); ZhaoHuBodyList.Add("IP", ipString); ZhaoHuBodyList.Add("port", sendport); ZhaoHuList.Add("a", "findController"); ZhaoHuList.Add("m", 1); ZhaoHuList.Add("body", ZhaoHuBodyList); string a = JsonMapper.ToJson(ZhaoHuList); SendMessages(a); } void Update() { } void BeginListening() { IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)(sender); while (true) { data = new byte[1024];//实例化data recv = newsock.ReceiveFrom(data, ref Remote); mydata = Encoding.ASCII.GetString(data, 0, recv); Debug.Log(mydata); GetMassage(mydata); } } public void SendMessages(string message) { Debug.Log(message); byte[] data = new byte[1024]; server.SendTo(Encoding.ASCII.GetBytes(message), sender); } void OnDestroy() { newsock.Close(); server.Close(); } void GetMassage(string massage) { if (massage.Contains("findController") && massage.Contains("deviceId")) { JsonData data = JsonMapper.ToObject(massage); bangDingIP.deviceId = (int)data["body"]["deviceId"]; if (bangDingIP.deviceId == 0) { bangDingIP.IP = (string)data["body"]["IP"]; sendipaddress = bangDingIP.IP; sender = new IPEndPoint(IPAddress.Parse(sendipaddress), sendport); } } else { AnalyticalMassage(massage); } } //解析收到的信息传入解析类 public void AnalyticalMassage(string massage) { AnalyticalUDPData.Instance.AnalyticalMassage(massage); } }
相关文章推荐
- uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据)
- C# 当通讯数据比较多,需要分组发送,对DataSetToJson的重载
- AFNetworking进行POST请求中 发送json数据有些特别
- vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据
- C#局域网内UDP广播获取获取JSON数据并解析
- ios开发之发送UDP广播并接收数据
- 发送UDP广播并接收数据
- uip UDP 服务器广播模式(客户端可以任意端口,并且主动向客户端发送数据) (转)
- iphone发送udp广播并接收数据
- Socket 进行UDP广播数据(GCDAsyncUdpSocket)
- js 与 php 通过json数据进行通讯
- udp广播发送数据
- android发送UDP广播及在PC上接受广播数据
- 使用QJson解析Qt通过UDP发送的JSON数据
- Android网络开发中如何使用JSON进行网络通信---Android_JSON数据通讯方法解析
- UDP的socket绑定到IP地址后无法接受广播数据
- JSON - 使用cJSON 解析Qt通过UDP发送的JSON数据
- 关于单片机TCP/IP协议栈的实现目前的进度和问题——TCP或UDP发送数据,端口绑定问题
- ios开发之发送UDP广播并接收数据
- ios开发之发送UDP广播并接收数据