用UDP进行广播后绑定发送Json数据进行通讯

不只局限于Unity与Unity 之间的通讯。

用UDP通讯,要绑定服务器的IP以及端口号,同样服务器也要知道它的信息要发给谁,所以客户端要将自己的IP以及端口号发送给服务器,以便服务器直接发送数据到该客户端。

可能遇到的问题:

1.服务器接收到信息后,发送信息,客户端接收不到,用抓包工具进行检测的时候,发现客户端的端口号一直在更改。

端口号不断更改是正常的。服务器只需要处理只要是从该客户端IP发从过来的信息就可以,不用管端口号改成了什么。服务器与客户端发送信息时,端口号要按规定的发送,并且服务器与客户端要严格按照规定的协议进行发送信息。

2.处理Json信息的时候,Json数据接收后,在处理时发现处理到某个数据就不再继续处理,处理中断。

Json数据处理的时候数据类型有:string,int,bool,double,如果你用float类型接收数据,就会处理出错,导致处理中断。

3.调用数据的时候,不要在次线程中调用数据。要将数据保存,由主线程去调用或者设置场景中的一些信息。

发送的Json数据是集合中存在集合的情况,不同的Json数据,定义的方式不同。

代码如下:

扫描二维码关注公众号,回复: 1923667 查看本文章
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();//子线程开始    
        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);
    }

}


猜你喜欢

转载自blog.csdn.net/lei_7103/article/details/75408087