Client.java
package com.codegym.task.task30.task3008;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
public class Server {
public static void main(String[] args) throws IOException {
int port = ConsoleHelper.readInt();
ServerSocket ss = new ServerSocket(port);
System.out.println("Server is running.");
for(;;){
try {
new Handler(ss.accept()).start();
} catch (Exception e) {
System.out.println(e.getMessage());
ss.close();
break;
}
}
}
private static Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
public static void sendBroadcastMessage (Message message){
connectionMap.forEach((k,v)->{
try {
v.send(message);
} catch (IOException ioe) {
try {
v.send(new Message(MessageType.TEXT,ioe.getMessage()));
} catch (IOException e) {
ConsoleHelper.writeMessage("Message couldn't be sent.");
}
}
});
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException{
for (;;) {
connection.send(new Message(MessageType.NAME_REQUEST, "\n\nWhat is your name?\n"));
Message received = connection.receive();
if (received.getType()!=MessageType.USER_NAME) continue;
String newUser = received.getData();
if (newUser.equals("")){
//connection.send(new Message(MessageType.TEXT, "\nDid you enter something?\n"));
continue;
}
if (connectionMap.containsKey(newUser)) {
//connection.send(new Message(MessageType.TEXT, "\n\nUsername already in use.\n"));
continue;
}
connectionMap.put(newUser,connection);
connection.send(new Message(MessageType.NAME_ACCEPTED, "\n\nUser created.\nLogging in...\n"));
return newUser;
}
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (Map.Entry<String,Connection> i : connectionMap.entrySet()){
if (!i.getKey().equals(userName)) connection.send(new Message(MessageType.USER_ADDED,i.getKey()));
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
for (;;) {
try {
Message received = connection.receive();
if (received.getType().equals(MessageType.TEXT)) {
Message newMessage = new Message(MessageType.TEXT,userName+": "+received.getData());
sendBroadcastMessage(newMessage);
} else {
ConsoleHelper.writeMessage("Error!");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public void run(){
ConsoleHelper.writeMessage("Connection estabilished: "+socket.getRemoteSocketAddress());
try {
Connection connection = new Connection(socket);
String userName = serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED,userName));
notifyUsers(connection,userName);
serverMainLoop(connection,userName);
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED,userName));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}