forked from 91yun/finalspeed
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ClientManager.java
91 lines (74 loc) · 2.01 KB
/
ClientManager.java
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
// Copyright (c) 2015 D1SM.net
package net.fs.rudp;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import net.fs.utils.MLog;
public class ClientManager {
HashMap<Integer, ClientControl> clientTable=new HashMap<Integer, ClientControl>();
Thread mainThread;
Route route;
int receivePingTimeout=8*1000;
int sendPingInterval=1*1000;
Object syn_clientTable=new Object();
ClientManager(Route route){
this.route=route;
mainThread=new Thread(){
@Override
public void run(){
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scanClientControl();
}
}
};
mainThread.start();
}
void scanClientControl(){
Iterator<Integer> it=getClientTableIterator();
long current=System.currentTimeMillis();
//MLog.println("ffffffffffff "+clientTable.size());
while(it.hasNext()){
ClientControl cc=clientTable.get(it.next());
if(cc!=null){
if(current-cc.getLastReceivePingTime()<receivePingTimeout){
if(current-cc.getLastSendPingTime()>sendPingInterval){
cc.sendPingMessage();
}
}else {
//超时关闭client
MLog.println("超时关闭client "+cc.dstIp.getHostAddress()+":"+cc.dstPort+" "+new Date());
// System.exit(0);
synchronized (syn_clientTable) {
cc.close();
}
}
}
}
}
void removeClient(int clientId){
clientTable.remove(clientId);
}
Iterator<Integer> getClientTableIterator(){
Iterator<Integer> it=null;
synchronized (syn_clientTable) {
it=new CopiedIterator(clientTable.keySet().iterator());
}
return it;
}
ClientControl getClientControl(int clientId,InetAddress dstIp,int dstPort){
ClientControl c=clientTable.get(clientId);
if(c==null){
c=new ClientControl(route,clientId,dstIp,dstPort);
synchronized (syn_clientTable) {
clientTable.put(clientId, c);
}
}
return c;
}
}