Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходит

97
19 апреля 2021, 19:30

Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходит. Причём не выводится никакой ошибки, просто программа выводит только одну строку (сообщение для клаиента)

import javax.imageio.IIOException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class CleentServer {

    public static class Cleent {
        public static void main(String[] args) {
            new Cleent().reception();
            new Cleent().sending();
        }
       public void sending(){
            try {
                Socket socket = new Socket("localhost", 5000);
                PrintWriter writer = new PrintWriter(socket.getOutputStream());
                writer.println("Сообщение для сервера");
                writer.close();
            } catch (IIOException ex){
                ex.printStackTrace();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
       }
        public void reception(){
            try {
                Socket socket = new Socket("localhost", 5000);
                InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
                BufferedReader reader = new BufferedReader(inputStreamReader);
                String messeg = reader.readLine();
                System.out.println(messeg);//вывод на экран сообщения от сервера
                reader.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    public static class Server {
        public static void main(String[] args) {
            new Server().sending();
            new Server().reception();
        }  public void sending(){
            try {
                ServerSocket serverSocket = new ServerSocket(5000);
                while (true) {
                    Socket socket = serverSocket.accept(); //блокирует сокет до тех пор
                    //пока нет связи с клеентом
                    PrintWriter writer = new PrintWriter(socket.getOutputStream());//отправляет
                    //сообщение клеенту
                    writer.println("Сообщение для клеента");
                    writer.close();//закрывает сокет
                }
            }catch (IIOException ex) {
                ex.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public void reception(){
            try {
                ServerSocket serverSocket2 = new ServerSocket(5000);
                while (true) {
                    Socket socket = serverSocket2.accept(); //блокирует сокет до тех пор
                    //пока нет связи с клеентом
                    InputStreamReader reader = new InputStreamReader(socket.getInputStream());
                    BufferedReader bufferedReader = new BufferedReader(reader);
                    String messege = bufferedReader.readLine();
                    System.out.println(messege);
                    bufferedReader.close();
                }
            }catch (Exception ex){
                ex.printStackTrace();
        }

            } 
            }

        }
Answer 1

Вы создаёте два разных сервера на одном и том же порте. Естественно, что один из них не работает.
Вдобавок, вы создаёте по одному сокету у клиента и сервера для передачи и принятия сообщения. С обеими этими задачами справляется один сокет.
Чтобы принимать и отправлять сообщения, у сервера и у клиента нужно создать Reader и Writer. Тут существуют вариации c PrintWriter, BufferedWriter, а также с BufferedReader, Scanner и т.д.

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

Правильный код для клиента и сервера будет выглядеть так. В данном примере используется try с ресурсами для автозакрытия сокетов и потоков вывода и ввода.

Client

public class Client {
    public static void main(String[] args) {
        try(Socket socket = new Socket("localhost", 5000);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
            out.write("Сообщение для сервера\n");
            out.flush(); // \n и flush() нужны, чтобы BufferedReader на стороне сервера смог принять сообщение
            String serverMessage = in.readLine();
            System.out.println(serverMessage);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Server

public class Server {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(5000);
             Socket socket = serverSocket.accept();
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
            String clientMessage = in.readLine();
            System.out.println(clientMessage);
            out.write("Сообщение для клиента\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Результат в консоли клиента:
Сообщение для клиента

Результат в консоли сервера:
Сообщение для сервера

Статья про сокеты

READ ALSO
Считывание меток через метод RFIDWithUHF.readTagFromBuffer не возвращает Tid, а только EPC

Считывание меток через метод RFIDWithUHF.readTagFromBuffer не возвращает Tid, а только EPC

Внезапно возникла проблема при считывании меток, стандартный метод

111
Коллекция из повторяющихся элементов в строке

Коллекция из повторяющихся элементов в строке

Нужно составить список нужных фрагментов из строки

84
Внутренние отступы в toolbar android

Внутренние отступы в toolbar android

Как динамически в коде изменить внутренние отступы в toolbar? Изначальные отступы задаю в xml:

66
Как сохранить объект в bundle?

Как сохранить объект в bundle?

У меня есть класс,который я хочу сохранить в bundleЯ знаю что для этого нужно implements Parcelable

102