|
1
2
3
|
package pad.prac2;
import java.io.IOException;
|
|
4
|
import java.util.Iterator;
|
|
5
|
import java.util.Set;
|
|
6
|
import java.util.concurrent.ConcurrentHashMap;
|
|
7
8
9
|
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
|
|
10
11
12
13
|
public class Server
{
private MyServerSocket ss;
|
|
14
|
private int roomSize;
|
|
15
16
17
18
19
20
|
private boolean kill;
private Connection[] workerPool;
private int freeWorkers;
private Lock lock;
private Condition availableWorkers;
private ConcurrentHashMap<Connection,String> activeConnections;
|
|
21
22
|
public Server(String ip, int port, int rS)
|
|
23
24
25
|
{
try
{
|
|
26
|
ss = new MyServerSocket();
|
|
27
28
|
lock = new ReentrantLock();
activeConnections = new ConcurrentHashMap<Connection,String>();
|
|
29
|
roomSize = rS;
|
|
30
31
32
33
34
35
36
37
38
39
|
freeWorkers = roomSize;
kill = false;
availableWorkers = lock.newCondition();
workerPool = new Connection[roomSize];
for(int i = 0; i < roomSize; i++)
{
workerPool[i] = new Connection(this);
workerPool[i].start();
}
ss.bind(ip, port);
|
|
40
41
42
43
44
45
|
}
catch(IOException ioExc)
{
System.out.println("TCP: Error initializating server socket");
}
}
|
|
46
|
|
|
47
|
public void sendToChat(Connection origin, String message)
|
|
48
|
{
|
|
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
lock.lock();
String nickname = activeConnections.get(origin);
Set<Connection> connections = activeConnections.keySet();
Iterator<Connection> it = connections.iterator();
Connection conn;
while(it.hasNext())
{
conn = it.next();
if(conn != origin)
{
conn.sendMessage(nickname + ": " + message);
}
}
lock.unlock();
|
|
63
64
|
}
|
|
65
|
public void startServer()
|
|
66
|
{
|
|
67
|
while(!kill)
|
|
68
|
{
|
|
69
70
71
72
73
74
75
|
MySocket incoming = ss.accept();
if(incoming != null)
{
System.out.println("Accepted connection from " + incoming.getInetAddress());
startWorker(incoming);
}
|
|
76
|
}
|
|
77
78
79
80
81
82
83
|
}
public void startWorker(MySocket s)
{
lock.lock();
while(freeWorkers == 0)
|
|
84
|
{
|
|
85
86
87
88
89
90
91
92
93
94
|
try
{
lock.unlock();
availableWorkers.await();
lock.lock();
}
catch(InterruptedException intExc)
{
intExc.printStackTrace();
}
|
|
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
|
workerPool[roomSize - freeWorkers].setSock(s);
workerPool[roomSize - freeWorkers].awake();
workerPool[roomSize - freeWorkers] = null;
freeWorkers--;
lock.unlock();
}
public String getNickname(Connection c)
{
return activeConnections.get(c);
}
public void finishWorker(Connection c)
{
lock.lock();
freeWorkers++;
workerPool[roomSize - freeWorkers] = c;
availableWorkers.signal();
lock.unlock();
}
public void addToChatroom(Connection c, String nickName)
{
activeConnections.put(c, nickName);
System.out.println(nickName + " has entered the room");
|
|
121
122
|
}
|
|
123
|
public void finishConnections()
|
|
124
|
{
|
|
125
126
|
Set<Connection> conns = activeConnections.keySet();
Iterator<Connection> it = conns.iterator();
|
|
127
128
|
while(it.hasNext())
{
|
|
129
|
it.next().finish();
|
|
130
131
132
133
134
|
}
}
public void killServer()
{
|
|
135
|
kill = true;
|
|
136
|
ss.close();
|
|
137
|
finishConnections();
|
|
138
|
}
|
|
139
|
}
|