public class ClientGuiModel extends Client{
private final Set<String> allUserNames = new LinkedHashSet<>();
private String newMessage;
public Set<String> getAllUserNames() {
return Collections.unmodifiableSet(new LinkedHashSet<>(allUserNames));
}
public String getNewMessage() {
return newMessage;
}
public void setNewMessage(String newMessage) {
this.newMessage = newMessage;
}
public void addUser(String newUserName){
allUserNames.add(newUserName);
}
public void deleteUser(String userName){
allUserNames.remove(userName);
}
}
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.jar.Attributes;
import static com.codegym.task.task30.task3008.MessageType.*;
//import static com.codegym.task.task30.task3008.ConsoleHelper.writeMessage;
public class Server {
private static Map<String, Connection> connectionMap;
static {
connectionMap = new ConcurrentHashMap();
}
public static void main(String[] args) throws IOException {
int port = ConsoleHelper.readInt();
ServerSocket ss = new ServerSocket(port);
ConsoleHelper.writeMessage("Server is running");
try {
while (true) {
// socket object to receive incoming client requests
Socket s = ss.accept();
// create a new thread object
Handler handler = new Handler(s);
handler.start();
}
}
catch(Exception e){
ConsoleHelper.writeMessage(e.getMessage());
ss.close();
}
}
public static void sendBroadcastMessage(Message message){
for(Connection c : connectionMap.values()){
try {
c.send(message);
} catch (IOException e) {
ConsoleHelper.writeMessage("Message couldn't be sent.");
}
}
}
private static class Handler extends Thread{
Socket socket;
public Handler(Socket socket){
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
Message m1;
String x;
do{
connection.send(new Message(MessageType.NAME_REQUEST));
m1 = connection.receive();
x = m1.getData();
}
while(m1.getType() != MessageType.USER_NAME || x == "" || connectionMap.containsKey(x));
connectionMap.put(x, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return x;
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (String name : connectionMap.keySet()){
if(!(name.equals(userName))) {
Message m = new Message(MessageType.USER_ADDED, name);
connection.send(m);
}
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
while(true) {
Message m = connection.receive();
if (m.getType() == MessageType.TEXT) {
Message m1 = new Message(TEXT, userName + ": " + m.getData());
sendBroadcastMessage(m1);
} else
ConsoleHelper.writeMessage("Error");
}
}
public void run(){
String userName = null;
Connection myConnect = null;
for (int i = 0; i < 1; i++) {
try {
ConsoleHelper.writeMessage("New connection was established with a remote address " + socket.getRemoteSocketAddress().toString());
myConnect = new Connection(socket);
} catch (Exception ig) {
break;
}
try {
userName = serverHandshake(myConnect);
} catch (Exception ig) {
try {
myConnect.close();
} catch (IOException e) {
e.printStackTrace();
}
break;
}
try {
sendBroadcastMessage(new Message(MessageType.USER_ADDED, userName));
notifyUsers(myConnect, userName);
serverMainLoop(myConnect, userName);
} catch (Exception e) {
} finally {
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
try {
myConnect.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
ConsoleHelper.writeMessage("Connection closed: "+socket.getRemoteSocketAddress().toString());
}
}
}