-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathLiteNetLibServer.cs
More file actions
170 lines (154 loc) · 7 KB
/
Copy pathLiteNetLibServer.cs
File metadata and controls
170 lines (154 loc) · 7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
using Cysharp.Text;
using Cysharp.Threading.Tasks;
using LiteNetLib;
using LiteNetLib.Utils;
using System.Collections.Generic;
namespace LiteNetLibManager
{
public class LiteNetLibServer : TransportHandler
{
public LiteNetLibManager Manager { get; protected set; }
public override string LogTag
{
get
{
using (var stringBuilder = ZString.CreateStringBuilder(false))
{
if (Manager != null)
{
stringBuilder.Append(Manager.LogTag);
}
else
{
stringBuilder.Append(LiteNetLibManager.TAG_NULL);
}
stringBuilder.Append('.');
stringBuilder.Append('S');
stringBuilder.Append('_');
stringBuilder.Append(GetType().Name);
return stringBuilder.ToString();
}
}
}
private bool _isNetworkActive;
public override bool IsNetworkActive { get { return _isNetworkActive; } }
public int ServerPort { get; protected set; }
public HashSet<long> ConnectionIds { get; private set; } = new HashSet<long>();
public LiteNetLibServer(LiteNetLibManager manager) : base()
{
Manager = manager;
}
public LiteNetLibServer(ITransport transport) : base(transport)
{
}
public void Update()
{
if (!IsNetworkActive)
return;
while (Transport.ServerReceive(out TransportEventData tempEventData))
{
OnServerReceive(tempEventData);
}
}
public bool StartServer(int port, int maxConnections)
{
if (IsNetworkActive)
{
Logging.LogWarning(LogTag, "Cannot Start Server, network already active");
return false;
}
// Clear and reset request Id
_requestCallbacks.Clear();
// Store server port, it will be used by local client to connect when start hosting
ServerPort = port;
if (_isNetworkActive = Transport.StartServer(port, maxConnections))
{
OnStartServer();
return true;
}
return false;
}
protected virtual void OnStartServer() { }
public void StopServer()
{
Transport.StopServer();
ServerPort = 0;
_isNetworkActive = false;
OnStopServer();
}
protected virtual void OnStopServer() { }
public virtual void OnServerReceive(TransportEventData eventData)
{
switch (eventData.type)
{
case ENetworkEvent.ConnectEvent:
if (Manager.LogInfo) Logging.Log(LogTag, $"OnPeerConnected peer.ConnectionId: {eventData.connectionId}");
ConnectionIds.Add(eventData.connectionId);
Manager.OnPeerConnected(eventData.connectionId);
break;
case ENetworkEvent.DataEvent:
ReadPacket(eventData.connectionId, eventData.reader);
break;
case ENetworkEvent.DisconnectEvent:
if (Manager.LogInfo) Logging.Log(LogTag, $"OnPeerDisconnected peer.ConnectionId: {eventData.connectionId} disconnectInfo.Reason: {eventData.disconnectInfo.Reason}");
ConnectionIds.Remove(eventData.connectionId);
Manager.OnPeerDisconnected(eventData.connectionId, eventData.disconnectInfo.Reason, eventData.disconnectInfo.SocketErrorCode);
break;
case ENetworkEvent.ErrorEvent:
if (Manager.LogError) Logging.LogError(LogTag, $"OnPeerNetworkError endPoint: {eventData.endPoint} socketErrorCode {eventData.socketError} errorMessage {eventData.errorMessage}");
Manager.OnPeerNetworkError(eventData.endPoint, eventData.socketError);
break;
}
}
public override void SendMessage(long connectionId, byte dataChannel, DeliveryMethod deliveryMethod, NetDataWriter writer)
{
Transport.ServerSend(connectionId, dataChannel, deliveryMethod, writer);
}
public void SendPacket(long connectionId, byte dataChannel, DeliveryMethod deliveryMethod, ushort msgType, SerializerDelegate serializer)
{
WritePacket(s_Writer, msgType, serializer);
SendMessage(connectionId, dataChannel, deliveryMethod, s_Writer);
}
public void SendMessageToAllConnections(byte dataChannel, DeliveryMethod deliveryMethod, NetDataWriter writer)
{
foreach (long connectionId in ConnectionIds)
{
SendMessage(connectionId, dataChannel, deliveryMethod, writer);
}
}
public void SendPacketToAllConnections(byte dataChannel, DeliveryMethod deliveryMethod, ushort msgType, SerializerDelegate serializer)
{
WritePacket(s_Writer, msgType, serializer);
SendMessageToAllConnections(dataChannel, deliveryMethod, s_Writer);
}
public bool SendRequest<TRequest>(long connectionId, ushort requestType, TRequest request, ResponseDelegate<INetSerializable> responseDelegate = null, int millisecondsTimeout = 30000, SerializerDelegate extraRequestSerializer = null)
where TRequest : INetSerializable, new()
{
if (!CreateAndWriteRequest(s_Writer, requestType, request, responseDelegate, millisecondsTimeout, extraRequestSerializer))
return false;
SendMessage(connectionId, 0, DeliveryMethod.ReliableUnordered, s_Writer);
return true;
}
public async UniTask<AsyncResponseData<TResponse>> SendRequestAsync<TRequest, TResponse>(long connectionId, ushort requestType, TRequest request, int millisecondsTimeout = 30000, SerializerDelegate extraSerializer = null)
where TRequest : INetSerializable, new()
where TResponse : INetSerializable, new()
{
bool done = false;
AsyncResponseData<TResponse> responseData = default;
// Create request
CreateAndWriteRequest(s_Writer, requestType, request, (requestHandler, responseCode, response) =>
{
if (!(response is TResponse))
response = default(TResponse);
responseData = new AsyncResponseData<TResponse>(requestHandler, responseCode, (TResponse)response);
done = true;
}, millisecondsTimeout, extraSerializer);
// Send request to target client
SendMessage(connectionId, 0, DeliveryMethod.ReliableUnordered, s_Writer);
// Wait for response
do { await UniTask.Delay(100); } while (!done);
// Return response data
return responseData;
}
}
}