Клиент Python Java сервер сервер получает ноль - PullRequest
0 голосов
/ 29 октября 2018

Как следует из названия, клиент отправляет ноль на сервер. я не могу понять, почему

клиент Python

import socket

HOST = "localhost"
PORT = 5000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

dict = {
    0: "doug",
    1: "korg",
    2: "stefan",

}
for x in range(0, 3):
    if x == 3:
        sock.sendall("Bye\n")
        print(sock.recv(1024))
    sock.sendall(b"{}\n".format(dict.get(x)))
    print(dict.get(x))
    print(sock.recv(1024))

Java-сервер:

    public void run() {
        String fromClient;
        String toClient;
        try {
            ServerSocket server = new ServerSocket(5000);
            System.out.println("wait for connection on port 5000");

            boolean run = true;
            Socket client = server.accept();

            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(), true);


            while (run) {
                System.out.println("got connection on port 5000");
                fromClient = in.readLine();
                System.out.println("received: " + fromClient);


                if (fromClient.equals("Bye")) {
                    toClient = "Aight later man";
                    System.out.println("send eyB");
                    out.println(toClient);
                    client.close();
                    System.out.println("socket closed");
                    break;
                }
                out.println("cool next User Please");
            }
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

пока первые 3 строки отправляются от клиента к серверу, а сервер отвечает обратно, когда отправляется Bye, сервер получает нулевое значение и выдает исключение nullpointerexception.

мой код основан на этом посте. Связь между клиентом Python и сервером Java

проблема существует в String как форма ByteString.

вывод сервера:

wait for connection on port 5000
got connection on port 5000
received: doug
got connection on port 5000
received: korg
got connection on port 5000
received: stefan
got connection on port 5000
Exception in thread "Thread-0" java.lang.NullPointerException
    at Jserver.run(Jserver.java:28)
received: null

Process finished with exit code 0

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

doug
cool next User Please

korg
cool next User Please

stefan
cool next User Please

Ответы [ 2 ]

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

Ну, в принципе у вас есть ответ в ваших логах

Exception in thread "Thread-0" java.lang.NullPointerException
  at Jserver.run(Jserver.java:28)
received: null

Итак, fromClient переменная null. Вы можете добавить простую проверку, чтобы избежать подобных исключений и пропустить продолжение цикла.

if (fromClient == null) {
  continue;
}
0 голосов
/ 29 октября 2018

Ваша проблема вызвана кодом Python, который никогда не отправляет команду "пока".

Ошибка в коде Python:

Ваш код Python циклически изменяется от 0 (включительно) до 3 (исключая), так как 3 исключается, код никогда не переходит в блок "пока" и никогда не отправляет это. (напечатайте x, чтобы подтвердить это)

Поместите код "пока" после цикла.

for x in range(0, 3):
    sock.sendall(b"{}\n".format(dict.get(x)))
    print(dict.get(x))
    print(sock.recv(1024))
sock.sendall("Bye\n")
print(sock.recv(1024))

Ошибка в коде Java

Да, в коде Java также есть ошибка, в основном из-за того, что он неправильно обрабатывает закрытие потока.

Когда программа Python закрывается в конце кода, Java-программа получит чистый выход, это без исключения способ закрытия сокета, и в результате readLine вернет нулевое значение.

Это значение NULL вызывает следующее исключение:

Exception in thread "Thread-0" java.lang.NullPointerException

Поскольку значение null означает, что сокет закрыт, вы также можете передать его как правильный «пока» ответ или как условие ошибки.

            if (fromClient == null || fromClient.equals("Bye")) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...