Валидатор задачу принял. В итоге когда я ввел порт, локалхост, у меня запросили имя. В итоге я ввел имя и мне выдало исключение. В чем прикол всего этого? Кидает исключение Unexpected Message Type. Помогите решить проблему, а то дальше не пройду…
public class Client {
protected Connection connection;
private volatile boolean clientConnected = false;
public static void main(String[] args) {
Client client = new Client();
client.run();
}
public void run(){
SocketThread socketThread = getSocketThread();
socketThread.setDaemon(true);
socketThread.start();
synchronized (this){
try {
this.wait();
} catch (InterruptedException e) {
ConsoleHelper.writeMessage("Error!");
e.printStackTrace();
}
}
if(clientConnected){
ConsoleHelper.writeMessage("Соединение установлено. Для выхода наберите команду ‘exit’");
while (clientConnected){
String message = ConsoleHelper.readString();
if(message.equalsIgnoreCase("exit")){
break;
}
if(shouldSendTextFromConsole()){
sendTextMessage(message);
}
}
}else{
ConsoleHelper.writeMessage("Произошла ошибка во время работы клиента.");
}
}
protected String getServerAddress(){
System.out.println("Enter server address: ");
return ConsoleHelper.readString();
}
protected int getServerPort(){
System.out.println("Enter server port: ");
return ConsoleHelper.readInt();
}
protected String getUserName() {
System.out.println("Enter your name: ");
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) {
clientConnected = false;
e.printStackTrace();
}
}
public class SocketThread extends Thread{
@Override
public void run() {
try {
int port = getServerPort();
String serverAddress = getServerAddress();
Socket socket = new Socket(serverAddress, port);
Client.this.connection = new Connection(socket);
clientHandshake();
clientMainLoop();
}catch (IOException | ClassNotFoundException e){
notifyConnectionStatusChanged(false);
e.printStackTrace();
}
}
protected void processIncomingMessage(String message){
ConsoleHelper.writeMessage(message);
}
protected void informAboutAddingNewUser(String userName){
ConsoleHelper.writeMessage(userName + " joined the room");
}
protected void informAboutDeletingNewUser(String userName){
ConsoleHelper.writeMessage(userName + " left the room");
}
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(connection.receive().getType() == MessageType.NAME_ACCEPTED){
notifyConnectionStatusChanged(true);
return;
}else throw new IOException("Unexpected MessageType");
}
}
protected void clientMainLoop() throws IOException, ClassNotFoundException{
while (true){
Message message = Client.this.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");
}
}
}
}