如何使用TCP套接字在Java和Python之间进行连续通信

如何使用TCP套接字在Java和Python之间进行连续通信,java,python,Java,Python,我试图做的是:从Java客户端向Python服务器发送一个图像。Python服务器从图像中检测到一个对象,并将检测框坐标发回。服务器必须保持连接 问题1:接收数据的最佳方式是什么 当我收到Python中的图像时,我将clientsocket.recv(1024)与while循环一起使用,但是recv正在阻塞而不是中断循环。 立即接收数据,如使用recv(400000)或在len(数据)!=1024两者都可以,但我想知道是否有其他方法可以中断循环或接收数据,因为您可能会得到大于4000000的图像

我试图做的是:从Java客户端向Python服务器发送一个图像。Python服务器从图像中检测到一个对象,并将检测框坐标发回。服务器必须保持连接

问题1:接收数据的最佳方式是什么

当我收到Python中的图像时,我将
clientsocket.recv(1024)
与while循环一起使用,但是
recv
正在阻塞而不是中断循环。 立即接收数据,如使用
recv(400000)
或在
len(数据)!=1024
两者都可以,但我想知道是否有其他方法可以中断循环或接收数据,因为您可能会得到大于
4000000
的图像或是
1024
的倍数的数据

当我单击UI中的按钮时,Java正在发送图像。如果我使用
settimeout
或setblocking`,Python服务器将不会等到我单击按钮来镜像发送它

问题2:如何在客户端关闭之前保持连接

一旦连接,我将接收图像和发送坐标放在while循环中,这样我就不必每次发送图像时都重新连接。但因为发送坐标是在while循环中,所以Java客户机在while循环中断之前不会接收坐标

Python服务器:

clientsocket, addr = s.accept()
    while True:
        f = open('image.jpg', 'wb')
                while True:
                    data = clientsocket.recv(1024)
                    f.write(data)
                    if not data:
                        break
        detectObject("image.jpg")
        clientsocket.send(detection coordinates)
Java客户端:

try {
    Socket socket = new Socket((host,port));
    // when click a button, it sends an image 
    ...
    bufferedReader.readLine;
    } catch (Exception e) {e.printStackTrace;}
// and some other codes
只要Python服务器处于活动状态,Java就会保持连接。只是想弄清楚如何修复python服务器代码,以便它在接收图像时保持连接,并在客户端发送图像时发送回坐标


现在,我能做的最好的事情就是每次Python服务器发回坐标时重新连接。但是我希望避免每次发送图像进行对象检测时都重新连接。

如果您想将套接字重新用于另一个请求(即,客户端不会在该请求后关闭套接字),并且您不知道发送的内容有多大,则此代码将无法工作。真的没有好办法知道数据的结尾在哪里

最简单的解决方案是在发送图像之前发送长度。然后,您可以从套接字读取正确数量的数据。因此,您的代码可能如下所示:

clientsocket, addr = s.accept()
while True:
    data = clientsocket.recv(4)
    # ... turn 4 bytes in 'data' into integer 'count'
    f = open('image.jpg', 'wb')
    while count > 0:
        data = clientsocket.recv(min(count, 1024))
        count -= len(data)
        f.write(data)
    detectObject("image.jpg")
    clientsocket.send(detection coordinates)

如果我正确理解您的问题,这将解决您的两个问题

如果您想将套接字重新用于另一个请求(也就是说,客户机不会在该请求之后关闭套接字),并且您不知道发送的内容有多大,则此代码将不起作用。真的没有好办法知道数据的结尾在哪里

最简单的解决方案是在发送图像之前发送长度。然后,您可以从套接字读取正确数量的数据。因此,您的代码可能如下所示:

clientsocket, addr = s.accept()
while True:
    data = clientsocket.recv(4)
    # ... turn 4 bytes in 'data' into integer 'count'
    f = open('image.jpg', 'wb')
    while count > 0:
        data = clientsocket.recv(min(count, 1024))
        count -= len(data)
        f.write(data)
    detectObject("image.jpg")
    clientsocket.send(detection coordinates)

如果我正确理解您的问题,这将解决您的两个问题

这里缺少太多的代码,至少在Java方面是如此。请给我们看一个例子。我已经用Python做了大量的套接字编程。如果你能更清楚地说明你的问题,我可能会帮助你。如果你的问题之一,你不知道如何读取正确数量的字节从套接字的形象,因为发件人没有关闭连接?这是一个典型的问题。我所要做的就是停止接收数据,如果你不再获得数据,就继续前进。但是在我的代码中,recv(1024)阻止了其余代码的执行,因为它一直在等待获取更多的数据。如果您不知道要读取多少数据,就无法知道如何继续。这里缺少的代码太多了,至少在Java方面是如此。请给我们看一个例子。我已经用Python做了大量的套接字编程。如果你能更清楚地说明你的问题,我可能会帮助你。如果你的问题之一,你不知道如何读取正确数量的字节从套接字的形象,因为发件人没有关闭连接?这是一个典型的问题。我所要做的就是停止接收数据,如果你不再获得数据,就继续前进。但是在我的代码中,recv(1024)阻止了其余代码的执行,因为它一直在等待获取更多的数据。如果您不知道要读取多少数据,就无法知道如何继续。在发送实际图像数据之前发送大小数据非常有效。非常感谢你的帮助。现在,当我发回坐标时,Java客户端不会读取坐标数据,直到python服务器中的while True循环中断。。。但我希望在保持连接的同时接收坐标数据。你有什么解决办法吗?为什么断开环路会断开连接你不想知道你给的代码里有什么吗?您想跳出内部循环,发送响应,然后通过外部循环接收下一个请求吗?看起来会很好用的。您的代码正是大多数小型服务器所采用的基本形式。实际上,如果您获得EOF,您需要的是中断外部循环并关闭套接字连接。这意味着客户端已关闭其连接端,然后您希望清理您的端,然后再次调用listen()。在发送实际图像数据之前发送大小数据非常有效。非常感谢你的帮助。现在,当我发回坐标时,Java客户端不会读取坐标数据,直到python服务器中的while True循环中断。。。但我希望在保持连接的同时接收坐标数据。你有什么解决办法吗?为什么断开环路会断开连接你不想知道你给的代码里有什么吗?您想跳出内部循环,发送响应,然后通过外部循环接收下一个请求吗?看起来会很好用的。您的代码正是大多数小型服务器采用的基本形式。实际上,您想要的是打破外部循环并关闭