我的Java-Python套接字有问题。我的目标是通过套接字tcp将Java应用程序中的Json对象发送到python脚本并接收响应,但是Json发送后套接字被阻塞。下面是我的代码:
try {
Socket socket = new Socket(dstAddress, dstPort);
is = new DataInputStream(socket.getInputStream());
os = new DataOutputStream(socket.getOutputStream());
PrintWriter pw = new PrintWriter(os, true);
pw.println(jsonObject.toString());
System.out.println("Send to the socket jsonObject.");
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String response = in.readLine();
System.out.println("Response: " + response);
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
在以下几行python代码中:
HOST = "192.168.1.101" #localhost
PORT = 7011
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while (1):
print("\n\nAttending for client.....\n\n")
conn, addr = s.accept()
print("Connected by: " , addr)
data = ""
while 1:
temp = conn.recv(1024).decode()
if not temp:
break
data = data + temp
print("JSON Received!!!!!")
imageJson = {}
imageJson = json.loads(data)
# responding to the client
response = DbImages[elem[0]]
resp = "Prova"
conn.send(resp.encode())
如果我终止Java代码(ctrl + C),则从block和json退出的套接字将到达python。问题是什么?问题似乎出在in.readLine()。如果我删除该语句,那么套接字可以正常工作。
最佳答案
您的Python代码正在等待Java端完成操作并发送EOF,然后再进行响应(这就是recv
的含义,直到您得到一个空字节)。
您的Java代码正在等待Python端响应,然后再关闭套接字。
因此,他们都在互相等待。
删除readLine
意味着Java代码不再等待任何内容,因此发送完成后它就立即卡在Python代码上,这确实使问题消失了,但实际上,这并不是很多解决方案需要回应。
那么,他们应该怎么做?好吧,有几种不同的选择。
makefile
并调用readline
而不是循环到recv
。 raw_decode
(请参阅json
模块文档),直到成功为止。