Java Socket Server Связь с клиентом Python, программа не будет вводить «inputLine = in.readLine ()» - цикл - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать сервер сокетов в Java, который может взаимодействовать с клиентом Python. Я столкнулся с проблемой, что все работает нормально, если я запускаю сервер, отправляю сообщение через python, а затем сразу же завершаю работу, но если клиент отправляет сообщение и затем снова прослушивает сокет, сервер не отвечает.

Вот код, в основном взятый из этот пример из оракула

public class PrimeServer {

    public static void main(String[] args) throws IOException {

        int portNumber = 4444;

        try (
                ServerSocket serverSocket = new ServerSocket(portNumber);
                Socket clientSocket = serverSocket.accept();
                PrintWriter out =
                        new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream()))
        ) {

            String inputLine;
            String outputLine;
            String rawMessage;

            // Initiate conversation with client
            PrimeProtocol ppc = new PrimeProtocol();
            outputLine = String.format("%1022s", "Ready").replace(' ', '0');
            out.println(outputLine);
            System.out.println("Over while");
            while ((inputLine = in.readLine()) != null) {
                System.out.println("In while");
                if (ppc.processInput(Integer.parseInt(inputLine))){
                    rawMessage = "True";
                } else {
                    rawMessage = "False";
                }
                outputLine = String.format("%1024s", rawMessage).replace(' ', '0');
                System.out.println("Outputting " + rawMessage);
                out.println(outputLine);

            }
            System.out.println("Passed while.");
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port "
                    + portNumber + " or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}

И код Python для хорошей меры:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
init_message = init_message.replace('0', '')
print(init_message)
print(len(init_message))
sock.send(b'3')

С этим кодом вывод с сервера java:

Over while
In while
Outputting True
Passed while.

И вывод клиента:

1024
Ready

После чего разрывается соединение.

Но если я добавлю эту строку клиенту: new_message = sock.recv(msg_len).decode("UTF-8") Создание нового питона:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
print(len(init_message))
init_message = init_message.replace('0', '')
print(init_message)

sock.send(b'3')

new_message = sock.recv(msg_len).decode("UTF-8")

Сервер застревает и вывод только:

Over while

Пока клиент выводит:

1024
Ready

при глушении.

Есть идеи, что здесь происходит?

1 Ответ

0 голосов
/ 06 сентября 2018

Оказывается, это был сокет python, который нужно было сбросить. Новый код питона:

msg_len = 1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 4444))
init_message = sock.recv(msg_len).decode("UTF-8")
print(len(init_message))
init_message = init_message.replace('0', '')
print(init_message)

sock.send(b'3\n')

new_message = sock.recv(msg_len).decode("UTF-8")
print(new_message)

(добавлено \ n) к выходящему сообщению.

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