Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字在将json对象从Java传输到Python时被阻止_Java_Android_Python_Json_Sockets - Fatal编程技术网

套接字在将json对象从Java传输到Python时被阻止

套接字在将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

我对Java Python套接字有问题。我的目标是通过套接字tcp将一个Json对象从java应用程序发送到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),套接字将从块中退出,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,就像它是一个框架协议一样。事实并非如此,但只要您发送的顶级值是对象和数组,它就可以工作。然后Python代码可以在每次接收之后使用
    raw_decode
    (请参阅
    json
    模块文档),直到成功
  • 如果只发送一条消息,只需从Java关闭一半套接字(关闭写端),Python就会得到它的EOF,并在套接字的另一端仍然打开的情况下做出响应。(这听起来可能有点骇人听闻,但实际上这是非常普遍的——这是web浏览器的传统工作方式,尽管HTTP 1.1让事情变得有点复杂。)