我在使用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()。如果我删除该语句,则套接字可以正常工作。
答案 0 :(得分:1)
您的Python代码正在等待Java端完成操作并发送EOF,然后再进行响应(这就是recv
的意思,直到您得到一个空字节)。
您的Java代码正在等待Python端响应,然后再关闭套接字。
所以,他们俩都在等待对方。
删除readLine
意味着Java代码不再等待任何内容,因此它在发送完成后立即挂在Python代码上,这确实使问题消失了,但是并没有解决。如果您确实需要回应,可以提供很多解决方案。
那么,他们应该怎么做?好吧,有几种不同的选择。
makefile
而不是循环访问readline
。recv
(请参阅raw_decode
模块文档),直到成功为止。答案 1 :(得分:0)
您的回答不是一行,因为它似乎没有一行结尾。
这意味着它将readLine
永远读下去。
尝试在响应中添加换行符,以使readLine
感到满意:
resp = "Prova\n"