首页 > 解决方案 > Python客户端Java服务端接收null

问题描述

顾名思义,客户端将 null 发送到服务器。我不知道为什么

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,发送时服务器接收到 null 并引发 nullpointerexception。

我的代码基于这篇文章。 python客户端和java服务器之间的通信

问题以 ByteString 形式存在于 String 中。

服务器输出:

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

标签: javapythonsockets

解决方案


您的问题是在 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 代码中还有一个 bug,主要是它没有正确处理流闭包。

当 Python 程序在代码结束时被关闭时,Java 程序将收到一个干净的退出,这是一种无异常关闭套接字的方式,并将导致readLine返回一个空值。

然后,此 null 会导致以下异常:

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

由于看到一个null值意味着套接字已关闭,因此您也可以将其作为适当的“再见”响应或错误条件进行线程处理。

            if (fromClient == null || fromClient.equals("Bye")) {

推荐阅读