/
ClientNetwork.cs
142 lines (108 loc) · 4.4 KB
/
ClientNetwork.cs
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
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Security.Cryptography;
using Intersect.Logging;
using Intersect.Network.Events;
using Intersect.Network.Lidgren;
using JetBrains.Annotations;
using Lidgren.Network;
namespace Intersect.Network
{
public class ClientNetwork : AbstractNetwork, IClient
{
private readonly LidgrenInterface mLidgrenInterface;
public ClientNetwork([NotNull] NetworkConfiguration configuration, RSAParameters rsaParameters) : base(
configuration
)
{
Guid = Guid.Empty;
IsConnected = false;
IsServerOnline = false;
mLidgrenInterface = new LidgrenInterface(this, typeof(NetClient), rsaParameters);
mLidgrenInterface.OnConnected += HandleInterfaceOnConnected;
mLidgrenInterface.OnConnectionApproved += HandleInterfaceOnConnectonApproved;
mLidgrenInterface.OnConnectionDenied += HandleInterfaceOnConnectonDenied;
mLidgrenInterface.OnDisconnected += HandleInterfaceOnDisconnected;
AddNetworkLayerInterface(mLidgrenInterface);
}
public HandleConnectionEvent OnConnected { get; set; }
public HandleConnectionEvent OnConnectionApproved { get; set; }
public HandleConnectionEvent OnConnectionDenied { get; set; }
public HandleConnectionEvent OnDisconnected { get; set; }
public bool IsConnected { get; private set; }
public bool IsServerOnline { get; }
public int Ping
{
get
{
var connection = FindConnection<LidgrenConnection>(Guid.Empty);
//Log.Debug($"connection={connection},ping={connection?.NetConnection?.AverageRoundtripTime ?? -1}");
if (connection == null)
{
return -1;
}
return (int) (1000 * connection.NetConnection.AverageRoundtripTime);
}
}
public bool Connect()
{
if (IsConnected)
{
Disconnect("client_starting_connection");
}
if (mLidgrenInterface == null)
{
return false;
}
StartInterfaces();
return true;
}
public override bool Send(IPacket packet)
{
return mLidgrenInterface?.SendPacket(packet) ?? false;
}
public override bool Send(IConnection connection, IPacket packet)
{
return Send(packet);
}
public override bool Send(ICollection<IConnection> connections, IPacket packet)
{
return Send(packet);
}
protected virtual void HandleInterfaceOnConnected([NotNull] INetworkLayerInterface sender, [NotNull] ConnectionEventArgs connectionEventArgs)
{
Log.Info($"Connected [{connectionEventArgs.Connection?.Guid}].");
IsConnected = true;
OnConnected?.Invoke(sender, connectionEventArgs);
}
protected virtual void HandleInterfaceOnConnectonApproved([NotNull] INetworkLayerInterface sender, [NotNull] ConnectionEventArgs connectionEventArgs)
{
Log.Info($"Connection approved [{connectionEventArgs.Connection?.Guid}].");
OnConnectionApproved?.Invoke(sender, connectionEventArgs);
}
protected virtual void HandleInterfaceOnConnectonDenied([NotNull] INetworkLayerInterface sender, [NotNull] ConnectionEventArgs connectionEventArgs)
{
Log.Info($"Connection denied [{connectionEventArgs.Connection?.Guid}].");
OnConnectionDenied?.Invoke(sender, connectionEventArgs);
}
protected virtual void HandleInterfaceOnDisconnected([NotNull] INetworkLayerInterface sender, [NotNull] ConnectionEventArgs connectionEventArgs)
{
Log.Info($"Disconnected [{connectionEventArgs.Connection?.Guid ?? Guid.Empty}].");
IsConnected = false;
OnDisconnected?.Invoke(sender, connectionEventArgs);
}
public void Close()
{
StopInterfaces("closing");
}
internal void AssignGuid(Guid guid)
{
Guid = guid;
}
protected override IDictionary<TKey, TValue> CreateDictionaryLegacy<TKey, TValue>()
{
return new ConcurrentDictionary<TKey, TValue>();
}
}
}