Repository navigation
Expand file tree
/
Copy pathRemoteConnectCheck.cs
More file actions
128 lines (99 loc) · 2.88 KB
/
Copy pathRemoteConnectCheck.cs
File metadata and controls
128 lines (99 loc) · 2.88 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
using System;
using System.Collections.Generic;
using SuperSocketLite.SocketBase;
namespace ChatServer;
class RemoteConnectCheck
{
MainServer _appServer;
List<RemoteCheckState> _remoteList = new List<RemoteCheckState>();
bool _isCheckRunning = false;
System.Threading.Thread _checkThread = null;
public void Init(MainServer appServer, List<Tuple<string, string, int>> remoteInfoList)
{
_appServer = appServer;
foreach (var remoteInfo in remoteInfoList)
{
var serverAddress = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(remoteInfo.Item2), remoteInfo.Item3);
var remote = new RemoteCheckState();
remote.Init(remoteInfo.Item1, serverAddress);
_remoteList.Add(remote);
}
_isCheckRunning = true;
_checkThread = new System.Threading.Thread(this.CheckAndConnect);
_checkThread.Start();
}
public void Stop()
{
_isCheckRunning = false;
_checkThread.Join();
}
void CheckAndConnect()
{
while (_isCheckRunning)
{
System.Threading.Thread.Sleep(100);
foreach (var remote in _remoteList)
{
if(remote.IsPass())
{
continue;
}
else
{
remote.TryConnect(_appServer);
}
}
}
}
class RemoteCheckState
{
string _serverType;
System.Net.IPEndPoint _address;
IAppSession _session = null;
bool _isTryConnecting = false;
DateTime _checkedTime = DateTime.Now;
public void Init(string serverType, System.Net.IPEndPoint endPoint)
{
_serverType = serverType;
_address = endPoint;
}
public bool IsPass()
{
if ((_session != null && _session.Connected) || _isTryConnecting)
{
return true;
}
var curTime = DateTime.Now;
var diffTime = curTime.Subtract(_checkedTime);
if (diffTime.Seconds <= 3)
{
return true;
}
else
{
_checkedTime = curTime;
}
return false;
}
public async void TryConnect(MainServer appServer)
{
_isTryConnecting = true;
var activeConnector = appServer as SuperSocketLite.SocketBase.IActiveConnector;
try
{
var task = await activeConnector.ActiveConnect(_address);
if (task.Result)
{
_session = task.Session;
}
}
catch
{
}
finally
{
_isTryConnecting = false;
}
}
}
}