Такое выдает сервер:
Установлено соединение с удаленным адресом: /127.0.0.1:55235
Ошибка при обмене данными с удаленным сервером.
Такое выдает клиент:
Произошла ошибка во время работы клиента.
Код Server:
package com.javarush.task.task30.task3008;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Server {
private static Map<String, Connection> connectionMap = new ConcurrentHashMap<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(ConsoleHelper.readInt());
ConsoleHelper.writeMessage("Server has been started.");
while (true) {
try (Socket socket = serverSocket.accept()) {
Handler handler = new Handler(socket);
handler.start();
} catch (Exception e) {
serverSocket.close();
System.out.println(e);
break;
}
}
}
public static void sendBroadcastMessage(Message message) {
try {
for (Connection connection :
connectionMap.values()) {
connection.send(message);
}
} catch (IOException e) {
System.out.println(e);
}
}
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) {
Message answer = connection.receive();
connection.send(new Message(MessageType.NAME_REQUEST));
if (answer.getType() != MessageType.USER_NAME || answer.getData().equals("") ||
connectionMap.containsKey(answer.getData()))
continue;
else {
connectionMap.put(answer.getData(), connection);
connection.send(new Message(MessageType.NAME_ACCEPTED));
return answer.getData();
}
}
}
private void notifyUsers(Connection connection, String userName) throws IOException {
for (Map.Entry<String, Connection> user : connectionMap.entrySet()) {
if (!user.getKey().equals(userName))
connection.send(new Message(MessageType.USER_ADDED, user.getKey()));
}
}
private void serverMainLoop(Connection connection, String userName) throws IOException, ClassNotFoundException {
while (true) {
Message answer = connection.receive();
if (answer.getType() == MessageType.TEXT) {
String send = userName + ": " + answer.getData();
sendBroadcastMessage(new Message(MessageType.TEXT, send));
}
else
ConsoleHelper.writeMessage("Сообщение не является текстом.");
}
}
public void run() {
ConsoleHelper.writeMessage("Установлено соединение с удаленным адресом: " + 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));
ConsoleHelper.writeMessage("Connection with remote server has been closed.");
} catch (ClassNotFoundException | IOException e) {
ConsoleHelper.writeMessage("Ошибка при обмене данными с удаленным сервером.");
}
}
}
}
Код Client:
package com.javarush.task.task30.task3008.client;
import com.javarush.task.task30.task3008.Connection;
import com.javarush.task.task30.task3008.ConsoleHelper;
import com.javarush.task.task30.task3008.Message;
import com.javarush.task.task30.task3008.MessageType;
import java.io.IOException;
import java.net.Socket;
public class Client {
protected Connection connection;
private volatile boolean clientConnected = false;
public static void main(String[] args) {
Client client = new Client();
client.run();
}
protected String getServerAddress() throws IOException {
return ConsoleHelper.readString();
}
protected int getServerPort() throws IOException{
return ConsoleHelper.readInt();
}
protected String getUserName() throws IOException {
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("I/O exception.");
clientConnected = false;
}
}
public void run() {
SocketThread socketThread = getSocketThread();
socketThread.setDaemon(true);
socketThread.start();
try {
synchronized (this) {
this.wait();
}
} catch (InterruptedException e) {
ConsoleHelper.writeMessage("Interrupted exception.");
}
if (clientConnected) {
ConsoleHelper.writeMessage("Соединение установлено. Для выхода наберите команду 'exit'.");
while (clientConnected) {
String s = ConsoleHelper.readString();
if (s.equals("exit")) break;
if (shouldSendTextFromConsole()) sendTextMessage(s);
}
}
else ConsoleHelper.writeMessage("Произошла ошибка во время работы клиента.");
}
public class SocketThread extends Thread {
protected void processIncomingMessage(String message) {
ConsoleHelper.writeMessage(message);
}
protected void informAboutAddingNewUser(String userName) {
ConsoleHelper.writeMessage(userName + " has joined the chat.");
}
protected void informAboutDeletingNewUser(String userName) {
ConsoleHelper.writeMessage(userName + " has left the chat.");
}
protected void notifyConnectionStatusChanged(boolean clientConnected) {
Client.this.clientConnected = clientConnected;
synchronized (Client.this) {
Client.this.notify();
}
}
protected void clientHandshake() throws IOException, ClassNotFoundException {
while (true) {
Message message = connection.receive();
if (message.getType() == MessageType.NAME_REQUEST) {
String name = getUserName();
connection.send(new Message(MessageType.USER_NAME, name));
}
else if (message.getType() == MessageType.NAME_ACCEPTED) {
notifyConnectionStatusChanged(true);
return;
}
else throw new IOException("Unexpected MessageType");
}
}
protected void clientMainLoop() throws IOException, ClassNotFoundException {
while (true) {
Message message = connection.receive();
if (message.getType() == MessageType.TEXT) processIncomingMessage(message.getData());
else if (message.getType() == MessageType.USER_ADDED) informAboutAddingNewUser(message.getData());
else if (message.getType() == MessageType.USER_REMOVED) informAboutDeletingNewUser(message.getData());
else throw new IOException("Unexpected MessageType");
}
}
public void run() {
try {
String address = getServerAddress();
int port = getServerPort();
Socket socket = new Socket(address, port);
connection = new Connection(socket);
clientHandshake();
clientMainLoop();
} catch (IOException | ClassNotFoundException e) {notifyConnectionStatusChanged(false);}
}
}
}