我正在统一开发一款跨平台游戏,并且正在使用System.Net.Sockets
进行服务器和客户端之间的通信。
但是在某些iOS设备(iPhone Xs)中,游戏有时会突然停止接收UDP数据,在2款游戏中已发生1次。
我认为服务器上没有问题,因为游戏是多人游戏,而其他玩家继续玩游戏并接收/发送数据。
这是我的连接代码:
BroadcastClient = new UdpClient(Port);
BroadcastClient.Connect(BroadcastIp);
BroadcastClient.BeginReceive(new AsyncCallback(OnUdpReceive),null);
这是接收代码:
public void OnUdpReceive(IAsyncResult ar)
{
try
{
if (IsDisposed == true)
return;
IPEndPoint clientEndPoint = null;
byte[] bytes = BroadcastClient.EndReceive(ar,ref clientEndPoint);
Task.Run(() =>
{
string json = Encoding.UTF8.GetString(bytes);
UserResponseData response = JsonUtility.FromJson<UserResponseData>(json);
Ping = (int)((NetworkTimeController.NTC.CurrentTime - response.T) * 1000);
if (response.CT - NetworkTimeController.NTC.CurrentTime > 0.0f)
NetworkTimeController.NTC.Offsetvalue += response.CT - NetworkTimeController.NTC.CurrentTime;
if (response.P == null)
return;
if (LastPacketarrivedOnReconnect == false && response.P.OID == response.LPID)
LastPacketarrivedOnReconnect = true;
lock (ExecuteablePackets)
{
lock (HistoryOfPackets)
{
if (HistoryOfPackets.Any(x => x.OID == response.P.OID))
return;
HistoryOfPackets.Add(response.P);
UnOrderedexecutablePackets.Add(response.P);
}
}
});
}
catch (Exception exc)
{
Debug.LogError(exc);
ServerManager.SM.LogErrorToserver(exc.ToString(),string.Empty,LogType.Exception);
}
finally
{
try { BroadcastClient.BeginReceive(new AsyncCallback(OnUdpReceive),null); }
catch (Exception) { }
}
}
这是发送代码:
BroadcastManager.BM.BroadcastClient.Client.Send(bytes,bytes.Length,Socketflags.None);