Blame view

JChatServer/src/pad/prac2/Server.java 2.87 KB
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) throws IOException
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
}