Сокет-клиент не получает сообщения от сервера, только когда сервер выполняет цикл - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь заставить сервер (написанный на Python) и клиент (написанный на Java) общаться.Код сервера следующий:

import socket               # Import socket module
connection=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.bind(('',12800))
connection.listen(5)

connection_with_client, info_connection = connection.accept()

msg=b""
while(msg!=b"stop"):
    print("Entering loop")
    msg = connection_with_client.recv(1024)
    connection_with_client.send(b"This is a message")
    print("Sent")

connection_with_client.close()
connection.close()

Код клиента:

try {
        socket = new Socket(InetAddress.getLocalHost(),12800); 

        PrintWriter out = new PrintWriter(socket.getOutputStream());
        out.print("stop");
        out.flush();
        System.out.println("Sent");
        in = new BufferedReader (new InputStreamReader (socket.getInputStream()));
        String message_from_server = in.readLine();
        System.out.println("Received message : " + message_from_server);
        socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {               
            e.printStackTrace();
    }

Странная вещь: когда клиент отправляет сообщение «стоп», все идет нормально, сообщениес сервера получен клиентом.Теперь, когда клиент отправляет другое сообщение, отличное от «stop», сервер сообщает, что отправил сообщение, и во второй раз входит в цикл, однако клиент никогда не получает сообщение и застревает в инструкции in.readLine ().

Я действительно не понимаю, почему первый проход в цикле должен иметь одинаковые эффекты в обеих ситуациях ... Любая помощь приветствуется!

1 Ответ

0 голосов
/ 29 ноября 2018

На стороне клиента вы используете readLine.Очевидно, это читает строку, но как она определяет, где заканчивается строка?Ответ таков: ваш сервер должен добавлять конец строки ко всем сообщениям, которые вы отправляете клиенту.

Попробуйте добавить b'\r\n' или другие строки в вашей ОС.Поскольку readLine вызывается на стороне клиента, вы должны добавить конец строки клиента, а не серверной ОС.

Для Windows это b'\r\n'

Для Linux b'\n'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...