Skip to content

Commit 22474e9

Browse files
authored
Add files via upload
1 parent f032799 commit 22474e9

File tree

4 files changed

+247
-0
lines changed

4 files changed

+247
-0
lines changed

src/servers/ClientConnection.java

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package servers;
2+
3+
import java.io.BufferedReader;
4+
import java.io.InputStreamReader;
5+
import java.io.PrintWriter;
6+
import java.net.Socket;
7+
import java.util.concurrent.LinkedBlockingQueue;
8+
9+
public class ClientConnection
10+
{
11+
private Socket clientSocket;
12+
private PrintWriter messageSender;
13+
private BufferedReader messageReader;
14+
15+
private LinkedBlockingQueue<String> clientMessageList;
16+
17+
public ClientConnection(Socket clientSocket, LinkedBlockingQueue<String> clientMessageList) {
18+
this.clientSocket = clientSocket;
19+
this.clientMessageList = clientMessageList;
20+
21+
getIOStreams();
22+
new Thread ( new ServerReceiver(clientSocket, messageReader, clientMessageList) ).start();
23+
}
24+
25+
private void getIOStreams() {
26+
try {
27+
messageSender = new PrintWriter(clientSocket.getOutputStream(), true);
28+
messageReader = new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
29+
}
30+
catch (Exception e) {
31+
System.out.println("ERROR: Couldn't open Client Socket's IO Streams.");
32+
e.printStackTrace();
33+
}
34+
}
35+
36+
public void sendMessage(String clientMessage)
37+
{
38+
try{
39+
messageSender.println(clientMessage);
40+
}
41+
catch(Exception e) {
42+
System.out.println("Couldn't write message to client. Perhaps He has disconnected.");
43+
e.printStackTrace();
44+
}
45+
}
46+
}

src/servers/ServerListener.java

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package servers;
2+
3+
import java.net.InetAddress;
4+
import java.net.ServerSocket;
5+
import java.net.Socket;
6+
import java.util.ArrayList;
7+
import java.util.concurrent.LinkedBlockingQueue;
8+
9+
public class ServerListener implements Runnable
10+
{
11+
private ServerSocket serverSocket;
12+
private int port;
13+
private int backlog;
14+
private boolean serverIsRunning;
15+
16+
private ArrayList<ClientConnection> clientConnectionList;
17+
private LinkedBlockingQueue<String> clientMessageList;
18+
19+
public ServerListener(int port, int backlog,
20+
ArrayList<ClientConnection> clientConnectionList,
21+
LinkedBlockingQueue<String> clientMessageList)
22+
{
23+
this.port = port;
24+
this.backlog = backlog;
25+
this.clientConnectionList = clientConnectionList;
26+
this.clientMessageList = clientMessageList;
27+
}
28+
29+
@Override
30+
public void run()
31+
{
32+
openServerSocket();
33+
while (serverIsRunning)
34+
connectClients();
35+
closeServerSocket();
36+
}
37+
38+
private void openServerSocket()
39+
{
40+
try {
41+
serverSocket = new ServerSocket( port, backlog, InetAddress.getLocalHost() );
42+
serverIsRunning = true;
43+
}
44+
catch (Exception e) {
45+
System.out.println("ERROR: Couldn't open ServerSocket with: " +
46+
"\nPort: " + String.valueOf(port) +
47+
"\nBacklog" + String.valueOf(backlog) +
48+
"\nIP Address: Local Host IP Address.\nThe program will now exit.");
49+
e.printStackTrace();
50+
System.exit(-1);
51+
}
52+
}
53+
54+
private void closeServerSocket() {
55+
try {
56+
serverSocket.close();
57+
}
58+
catch (Exception e) {
59+
System.out.println("ERROR: Server's socket couldn't not be closed. It might still be in use.");
60+
e.printStackTrace();
61+
}
62+
}
63+
64+
private void connectClients()
65+
{
66+
System.out.println("Waiting for a new connection...");
67+
68+
try {
69+
Socket clientSocket = serverSocket.accept();
70+
clientConnectionList.add( new ClientConnection(clientSocket, clientMessageList) );
71+
72+
System.out.println( "Started connection with client " + clientSocket.getLocalAddress() );
73+
}
74+
catch (Exception e) {
75+
System.out.println("ERROR: Server couldn't accept a client.");
76+
e.printStackTrace();
77+
}
78+
}
79+
}

src/servers/ServerReceiver.java

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package servers;
2+
3+
import java.io.BufferedReader;
4+
import java.net.Socket;
5+
import java.util.concurrent.LinkedBlockingQueue;
6+
7+
public class ServerReceiver implements Runnable
8+
{
9+
private Socket clientSocket;
10+
private BufferedReader messageReader;
11+
LinkedBlockingQueue<String> clientMessageList;
12+
13+
public ServerReceiver(Socket clientSocket, BufferedReader messageReader, LinkedBlockingQueue<String> clientMessageList) {
14+
this.clientSocket = clientSocket;
15+
this.messageReader = messageReader;
16+
this.clientMessageList = clientMessageList;
17+
}
18+
19+
@Override
20+
public void run()
21+
{
22+
String clientMessage;
23+
while ( !clientSocket.isClosed() )
24+
{
25+
clientMessage = receiveClientMessage();
26+
if ( clientMessage == null || clientMessage.equals("$") )
27+
{
28+
closeReader();
29+
closeSocket();
30+
}
31+
else
32+
pushMessageToQueue(clientMessage);
33+
}
34+
}
35+
36+
private String receiveClientMessage()
37+
{
38+
String clientMessage;
39+
try {
40+
clientMessage = messageReader.readLine();
41+
}
42+
catch (Exception e) {
43+
System.out.println("ERROR: Couldn't receive Client's message. Maybe client has disconnected.");
44+
e.printStackTrace();
45+
return null;
46+
}
47+
return clientMessage;
48+
}
49+
50+
private void pushMessageToQueue(String clientMessage) {
51+
try {
52+
clientMessageList.put(clientMessage);
53+
} catch (InterruptedException e) {
54+
System.out.println("ERROR: Couldn't put clientMessage to Server's Queue. Queue might be full.");
55+
e.printStackTrace();
56+
}
57+
}
58+
59+
private void closeReader() {
60+
try {
61+
messageReader.close();
62+
}
63+
catch (Exception e) {
64+
System.out.println("ERROR: Couldn't close BufferedReader. Maybe It's already closed.");
65+
e.printStackTrace();
66+
}
67+
}
68+
private void closeSocket() {
69+
try {
70+
clientSocket.close();
71+
System.out.println("Connection with the client " +
72+
clientSocket.getLocalAddress().getHostAddress() +
73+
" has been terminated.");
74+
}
75+
catch (Exception e) {
76+
System.out.println("ERROR: Couldn't close client's socket. Maybe It's already closed.");
77+
e.printStackTrace();
78+
}
79+
}
80+
}

src/servers/ServerSender.java

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package servers;
2+
3+
import java.util.ArrayList;
4+
import java.util.concurrent.LinkedBlockingQueue;
5+
6+
public class ServerSender implements Runnable
7+
{
8+
private ArrayList<ClientConnection> clientConnectionList;
9+
private LinkedBlockingQueue<String> clientMessageList;
10+
11+
public ServerSender(ArrayList<ClientConnection> clientConnectionList,
12+
LinkedBlockingQueue<String> clientMessageList) {
13+
this.clientConnectionList = clientConnectionList;
14+
this.clientMessageList = clientMessageList;
15+
}
16+
17+
@Override
18+
public void run()
19+
{
20+
while (true)
21+
{
22+
if ( !clientMessageList.isEmpty() )
23+
{
24+
String clientMessage = getClientMessage();
25+
if (clientMessage != null)
26+
for (ClientConnection client : clientConnectionList)
27+
client.sendMessage(clientMessage);
28+
}
29+
}
30+
}
31+
32+
private String getClientMessage() {
33+
String clientMessage = null;
34+
try {
35+
clientMessage = clientMessageList.take();
36+
}
37+
catch (InterruptedException e) {
38+
e.printStackTrace();
39+
}
40+
return clientMessage;
41+
}
42+
}

0 commit comments

Comments
 (0)