java - 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
解决方案
您的问题是在 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")) {
推荐阅读
- node.js - process.env 在 webpack 之前未定义
- c - 无符号字符到十六进制字符串并返回,但结果不匹配
- ios - 我无法解决“无法为模拟器构建应用程序。'
- javascript - 开玩笑地返回模拟值的模拟函数
- sql - PL/SQL 使用函数从表中读取行数据
- dolphindb - REF001:
文件路径已归事务所有 - docker - 如何通过 tor 代理我的所有 docker 容器网络流量?
- ios - SwiftUI:如何使用 .sizeCategory 自定义 SegmentedControl 的文本大小
- css - Tailwind CSS 的基础:网格项目的中心对齐?
- javascript - 在 Vue 3 中访问 api 数据