Я только начал заниматься программированием сокетов, поэтому, чтобы лучше понять его, я хочу создать приложение для чата с несколькими клиентами.
Вот как я собираюсь это сделать:
После запуска приложения у вас есть два варианта: создать сервер или присоединиться к серверу.
Если вы решили создать сервер, новый поток запустится и будет размещен на сервере, а затем запустится другой поток, который собирается создать нового клиента и автоматически подключиться к серверу, просто собрав его.
И тут я столкнулся со следующей проблемой.
Каждый клиент может отправлять сообщения на сервер, но для того, чтобы обеспечить их синхронизацию для всех клиентов, я думал перенаправить полученные сообщения с сервера всем клиентам, как показано на следующей диаграмме.
Дело в том, что когда я пытаюсь прослушать и отправить как на клиенте, так и на сервере, я получаю эти ошибки.
java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:200)
at java.base/java.io.DataInputStream.readUnsignedShort(DataInputStream.java:342)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:594)
at java.base/java.io.DataInputStream.readUTF(DataInputStream.java:569)
at parctice.Server.lambda$main$0(Server.java:32)
at java.base/java.lang.Thread.run(Thread.java:835)
Это мой сервер:
int port = 4444;
try {
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("server starts port = " + serverSocket.getLocalSocketAddress());
while(true){
Socket socket = serverSocket.accept();
System.out.println("accepts : " + socket.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String[] message = {""};
new Thread(() -> {
try {
while(in.available() > 0){
System.out.println("SERVER > " + in.readUTF());
message[0] = in.readUTF();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
System.err.println(message[0]);
try {
out.writeUTF(message[0] + "REDIRECTED MESSAGE");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
и мой клиент:
int portNumber = 4444;
System.out.println("CLIENT > Trying to connect to the server...");
try {
Socket socket = new Socket("localhost", portNumber);
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
new Thread(() -> {
try {
while(in.available() > 0){
System.out.println("SERVER > " + in.readUTF());
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
try {
out.writeUTF("test");
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
В конце я хотел бы спросить вас, ребята, считаете ли вы, что логика, которую я пытаюсь использовать, является правильной, и если нет, пожалуйста, дайте мне знать, что не так, а также, если возможно, не могли бы вы объяснить мне, почему я не в состоянии слушать и отправлять как на клиенте, так и на сервере? Потому что, когда я пытаюсь отправить данные через клиента и получить их на сервере, все работает нормально, но я хотел бы выполнить оба пути связи.