как прочитать несколько строк с клиента на сервер

#java #networking #client-server

#java #сеть #клиент-сервер

Вопрос:

Итак, я пытаюсь отправлять несколько строк кода каждый раз, когда я что-то печатаю в клиентской консоли. Однако при выполнении этого он печатает выходные данные клиента на сервере только один раз, то, что я хотел бы сделать, это печатать выходные данные клиентов на сервере каждый раз после ввода строки.

Клиент:

     try {
        
        Scanner scanner = new Scanner(System.in);
        
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream;
        
        System.out.println("Write something to client:");
        
        while(scanner.hasNext()) {
            
            System.out.println("Write something to client:");
            outputStream = new DataOutputStream(socket.getOutputStream());
            
            
            String message = scanner.nextLine();
            
            outputStream.writeUTF(message);
        }
        
    } catch (IOException e) {
        System.out.println("[ERROR] Unable to get streams from server");
    }
}
  

Клиентский поток:

     @Override
public void run() {
    
    try {
        
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
        
        System.out.println(inputStream.readUTF());
        
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  

Сервер:
общедоступный сервер () {

     try {
        serverSocket = new ServerSocket(port);
        System.out.println("[SERVER] Server initialized successfully");
        // consider using!
        Runtime.getRuntime().addShutdownHook(new Thread());

    } catch (IOException e) {
        System.out.println("[ERROR] Unable to launch server on port "   port);
    }

    while (true) {
        Socket socket = null;

        try {
            socket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("[ERROR] Unable to accept client request");
        }

        System.out.println("[SERVER] New user joined the chat: "   socket);

        groupCounter  ;
        ClientThread client = new ClientThread("Client "   groupCounter, socket);

        Thread thread = new Thread(client);
        thread.start();

        groupClients.add(client);

        //System.out.println(groupCounter);

        
        
    }
  

Комментарии:

1. что вы подразумеваете под «вывод клиента на сервере печатается только один раз»? это потому, что сервер закрывает сокет? можете ли вы показать нам, как вы создаете объекты сокета?

2. Ни один сервер не закрывает его сокет, но если я ввожу что-то во ввод в клиентской консоли, оно выводится в серверной консоли только один раз. Что я хотел бы сделать, так это для каждой строки, которую я печатаю в клиентской консоли, я хотел бы, чтобы она также отображалась в консоли сервера. Я добавил некоторый код, чтобы показать, как я обрабатываю объекты сокета

3. итак, это потому, что клиент останавливает выполнение? вы также используете while (true) в классе Client?

4. Цикл while (true) не помог в клиенте, но сканер не записывает outputstream непрерывно, как кажется, с помощью цикла hasNext while.

Ответ №1:

Проблема заключается в стороне сервера, serverSocket.accept() останавливает выполнение и ожидает, пока клиент подключится к серверному сокету. Вот почему вы получаете только одно сообщение каждый раз.

Добавьте бесконечный цикл в ClientThread, чтобы убедиться, что он продолжает считывать входные данные клиентского сокета.

 try {
    while (true) {
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

        System.out.println(inputStream.readUTF());
    }
} catch (IOException e) {
    e.printStackTrace();
}