Не могу разобраться и ответа от валидатора дождаться.
public class Client {
protected Connection connection;
private volatile boolean clientConnected = false;
protected String getServerAddress() {
ConsoleHelper.writeMessage("Введите адрес Вашего сервера.");
return ConsoleHelper.readString();
}
protected int getServerPort() {
ConsoleHelper.writeMessage("Введите порт Вашего сервера.");
return ConsoleHelper.readInt();
}
protected String getUserName() {
ConsoleHelper.writeMessage("Введите Ваше имя.");
return ConsoleHelper.readString();
}
protected boolean shouldSendTextFromConsole() {
return true;
}
protected SocketThread getSocketThread() {
return new SocketThread();
}
protected void sendTextMessage(String text) {
try {
connection.send(new Message(MessageType.TEXT, text));
}
catch(IOException e) {
ConsoleHelper.writeMessage("Произошла ошибка при отправке сообщения.");
clientConnected = false;
}
}
public void run() {
Thread socketThread = getSocketThread();
socketThread.setDaemon(true);
socketThread.start();
try {
synchronized(this) { wait();}
}
catch(InterruptedException e) {
ConsoleHelper.writeMessage("Произошла непоправимая ошибка.");
System.exit(1);
}
if(clientConnected) {
ConsoleHelper.writeMessage("Соединение установлено. Для выхода наберите команду 'exit'.");
while(clientConnected) {
String text = ConsoleHelper.readString();
if(text.equals("exit")) break;
if(shouldSendTextFromConsole()) sendTextMessage(text);
}
}
else {
ConsoleHelper.writeMessage("Произошла ошибка во время работы клиента.");
}
}
public static void main(String[] args) throws IOException {
Client client = new Client();
client.run();
}
public class SocketThread extends Thread {
}
}package com.javarush.task.task30.task3008;
import java.net.Socket;
import java.net.ServerSocket;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.*;
import java.util.Set;
public class Server {
private static Map<String, Connection> connectionMap = new ConcurrentHashMap<String, Connection>();
public static void sendBroadcastMessage(Message message) {
try {
for (Connection value : connectionMap.values()) {
value.send(message);
}
}
catch(IOException e) {
ConsoleHelper.writeMessage("Сообщение не было отправлено.");
}
}
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(ConsoleHelper.readInt());
try {
while(true) {
Socket socet = serverSocket.accept();
Handler handler = new Handler(socet);
handler.start();
}
}
catch(Exception e) {
e.printStackTrace();
serverSocket.close();
}
}
private static class Handler extends Thread {
private Socket socket;
public Handler(Socket socket) {
this.socket = socket;
}
private String serverHandshake(Connection connection) throws IOException, ClassNotFoundException {
while(true) {
connection.send(new Message(MessageType.NAME_REQUEST));
Message answer = connection.receive();
if(!answer.getType().equals(MessageType.USER_NAME)) continue;
String name = answer.getData();
if(name.isEmpty()) continue;
if(connectionMap.containsKey(name)) continue;
connectionMap.put(name, connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return name;
}
}
private void sendListOfUsers(Connection connection, String userName) throws IOException {
String name = null;
Set<Map.Entry<String, Connection>> map = connectionMap.entrySet();
for (Map.Entry<String, Connection> me : map) {
if((name = me.getKey()).equals(userName)) continue;
connection.send(new Message(MessageType.USER_ADDED, name));
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
while(true) {
Message message = connection.receive();
if(message.getType() == MessageType.TEXT) {
String text = userName + ": " + message.getData();
sendBroadcastMessage(new Message(MessageType.TEXT, text));
}
else {
ConsoleHelper.writeMessage("Принятое сообщение не является текстом.");
}
}
}
public void run() {
ConsoleHelper.writeMessage(String.valueOf(socket.getRemoteSocketAddress()));
Connection connection = null;
String userName = null;
try {
connection = new Connection(socket);
userName = serverHandshake(connection);
sendBroadcastMessage(new Message(MessageType.USER_ADDED, userName));
sendListOfUsers(connection, userName);
serverMainLoop(connection, userName);
}
catch(ClassNotFoundException | IOException e) {
ConsoleHelper.writeMessage("Произошла ошибка при обмене данными с удаленным адресом");
}
if(userName != null) {
connectionMap.remove(userName);
sendBroadcastMessage(new Message(MessageType.USER_REMOVED, userName));
ConsoleHelper.writeMessage("Соединение с удаленным адресом " + connection.getRemoteSocketAddress() + " закрыто");
}
}
}
}