-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkServer.cs
More file actions
148 lines (121 loc) · 4.68 KB
/
NetworkServer.cs
File metadata and controls
148 lines (121 loc) · 4.68 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
using LiteNetLib;
using LiteNetLib.Utils;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NetworkShared;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using TTT.Server.Game;
using TTT.Server.NetworkShared;
using TTT.Server.NetworkShared.Registries;
namespace TTT.Server
{
public class NetworkServer : INetEventListener
{
NetManager netManager;
private readonly ILogger<NetworkServer> logger;
private readonly IServiceProvider serviceProvider;
private readonly NetDataWriter cachedWriter = new NetDataWriter();
private UsersManager usersManager;
public NetworkServer(ILogger<NetworkServer> logger, IServiceProvider provider)
{
this.logger = logger;
this.serviceProvider = provider;
}
public void Start()
{
netManager = new NetManager(this)
{
DisconnectTimeout = 300000
};
int port = 9050;
netManager.Start(port);
usersManager = serviceProvider.GetRequiredService<UsersManager>();
Console.WriteLine("Server is listening on port " + port.ToString());
}
public void PollEvent()
{
netManager.PollEvents();
}
public void OnConnectionRequest(ConnectionRequest request)
{
Console.WriteLine("Connection has requeset from " + request.RemoteEndPoint.ToString());
request.Accept();
}
public void OnNetworkError(IPEndPoint endPoint, SocketError socketError)
{
}
public void OnNetworkLatencyUpdate(NetPeer peer, int latency)
{
}
public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channelNumber, DeliveryMethod deliveryMethod)
{
using(var scope = serviceProvider.CreateScope())
{
try
{
PacketType packetType = (PacketType)reader.GetByte();
var packet = ResolvePacket(packetType, reader);
var handler = ResolveHandler(packetType);
handler.Handle(packet, peer.Id);
reader.Recycle();
}
catch (Exception ex)
{
logger.LogError(ex, "Error processing message of type");
}
}
//var data = Encoding.UTF8.GetString(reader.RawData);
//Console.WriteLine("Data recived from client: " + data);
////reply client
//var reply = "Test Reply!";
//var bytes = Encoding.UTF8.GetBytes(reply);
//peer.Send(bytes, DeliveryMethod.ReliableOrdered);
}
public void OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType)
{
}
public void OnPeerConnected(NetPeer peer)
{
logger.LogInformation($"Client connected to server: {peer.EndPoint}: ID: {peer.Id}");
usersManager.AddConnection(peer);
}
public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo)
{
var connection = usersManager.GetConnection(peer.Id);
netManager.DisconnectPeer(peer);
usersManager.SetPlayerDisconnected(peer.Id);
logger.LogInformation($"{connection.User?.Id} disconnected: {peer.Id}");
}
public IPacketHandler ResolveHandler(PacketType packetType)
{
var registry = serviceProvider.GetRequiredService<HandlerRegistry>();
var type = registry.Handlers[packetType];
return (IPacketHandler)serviceProvider.GetRequiredService(type);
}
private INetPacket ResolvePacket(PacketType packetType, NetPacketReader reader)
{
var registry = serviceProvider.GetRequiredService<PacketRegistry>();
var type = registry.PacketTypes[packetType];
var packet = (INetPacket)Activator.CreateInstance(type);
packet.Deserialize(reader);
return packet;
}
public void SendClient(int peerID, INetPacket packet, DeliveryMethod method = DeliveryMethod.ReliableOrdered)
{
var peer = usersManager.GetConnection(peerID).Peer;
peer.Send(WriteSerializeable(packet), method);
}
private NetDataWriter WriteSerializeable(INetPacket packet)
{
cachedWriter.Reset();
packet.Serialize(cachedWriter);
return cachedWriter;
}
}
}