Python客户端Java服务器接收空值
顾名思义,客户端向服务器发送null。我不明白为什么 Python客户端Python客户端Java服务器接收空值,java,python,sockets,Java,Python,Sockets,顾名思义,客户端向服务器发送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):
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
我的代码基于这篇文章。
该问题以字符串形式作为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
您的问题是由python代码引起的,它从不发送“bye”命令 python代码中的错误: python代码从0(包含)循环到3(独占),因为3被排除在外,所以代码永远不会进入“bye”块,也永远不会发送此消息。(打印x以确认这一点) 将“bye”代码放在循环后面 范围(0,3)内x的
:
sock.sendall(b“{}\n”.format(dict.get(x)))
打印(dict.get(x))
打印(sock.recv(1024))
sock.sendall(“再见”)
打印(sock.recv(1024))
Java代码中的错误
是的,Java代码中还有一个bug,主要是它没有正确处理流闭包
当Python程序在代码结束时关闭时,Java程序将收到一个干净的退出,这是一种关闭套接字的无异常方式,并将导致readLine
返回空值
此null将导致以下异常:
由于看到null
值意味着套接字已关闭,因此您也可以将其作为正确的“bye”响应或错误条件来执行
if (fromClient == null || fromClient.equals("Bye")) {
嗯,基本上你的日志里有答案
Exception in thread "Thread-0" java.lang.NullPointerException
at Jserver.run(Jserver.java:28)
received: null
所以fromClient
变量是null
。您可以为它添加简单的检查,以避免此类异常,并跳过循环继续
if (fromClient == null) {
continue;
}
@费里比格回答得很好,所以你可以忽略这个:)谢谢你的帮助。我认为range方法包括循环限制。我把你的建议放在我的代码里,它就像一个符咒!谢谢
if (fromClient == null) {
continue;
}