您的位置:首页 > Web前端 > JavaScript

用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数据,定义的方式不同。

代码如下:

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: