UDP로 브로드캐스트한 후 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();//
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);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
photonnetwork.instantiate에서 gamepobject 유형을 생성 한 다음 상태 및 값을 참조하는 방법주로 마지막 기사에서 일어난 일의 수정입니다. 지난번↓ 그럼 주제입니다. (타이틀이 정리되어 없어서 죄송합니다) 우선 전회의 Illegal view ID:0입니다만 photonnetwork.instantiate를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.