UDP로 브로드캐스트한 후 Json 데이터 바인딩하여 통신

5292 단어 UnityC#
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();//     
        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);
    }

}

좋은 웹페이지 즐겨찾기