套接字在将json对象从Java传输到Python时被阻止
我对Java Python套接字有问题。我的目标是通过套接字tcp将一个Json对象从java应用程序发送到python脚本,并接收一个响应,但在Json发送后套接字被阻塞。下面是我的代码:套接字在将json对象从Java传输到Python时被阻止,java,android,python,json,sockets,Java,Android,Python,Json,Sockets,我对Java Python套接字有问题。我的目标是通过套接字tcp将一个Json对象从java应用程序发送到python脚本,并接收一个响应,但在Json发送后套接字被阻塞。下面是我的代码: try { Socket socket = new Socket(dstAddress, dstPort); is = new DataInputStream(socket.getInputStream()); os = new DataOutputStream(socket.get
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),套接字将从块中退出,json将到达python。有什么问题?问题似乎出在.readLine()中。如果我删除了该语句,那么套接字将在没有块的情况下工作。您的响应不是一行,因为它似乎不包含一行结尾。 这意味着它将永远被读取 尝试在回复中添加新行,以使
readLine
happy:
resp = "Prova\n"
您的Python代码正在等待Java端完成并在响应之前发送EOF(这对
recv
意味着什么,直到您得到一个空字节)
Java代码正在等待Python端在关闭套接字之前做出响应
所以,他们都在等着对方
删除
readLine
意味着Java代码不再等待任何东西,所以只要发送完Python代码,它就会挂断Python代码,这确实会解决问题,但如果您确实需要响应,这并不是一个很好的解决方案
那么,他们应该做什么呢?嗯,有几个不同的选择
- 使用框架协议,其中Java端要么在每条消息之后发送一个“message done”分隔符,要么在每条消息之前发送一个标头(例如,消息的字节长度)。因此,Python代码可以一直读取,直到它有一个完整的消息,而不是直到EOF。
- 如果将JSON编码为压缩格式,除了可打印的ASCII转义码,那么分隔符可以是一个换行符(此时您使用JSONlines作为协议),Python代码可以在套接字上使用
,并调用makefile
,而不是循环readline
recv
- 如果将JSON编码为压缩格式,除了可打印的ASCII转义码,那么分隔符可以是一个换行符(此时您使用JSONlines作为协议),Python代码可以在套接字上使用
- 欺骗并使用JSON,就像它是一个框架协议一样。事实并非如此,但只要您发送的顶级值是对象和数组,它就可以工作。然后Python代码可以在每次接收之后使用
(请参阅raw_decode
模块文档),直到成功json
- 如果只发送一条消息,只需从Java关闭一半套接字(关闭写端),Python就会得到它的EOF,并在套接字的另一端仍然打开的情况下做出响应。(这听起来可能有点骇人听闻,但实际上这是非常普遍的——这是web浏览器的传统工作方式,尽管HTTP 1.1让事情变得有点复杂。)