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

时间:2019-04-21 00:14:41

标签: java python

我要执行的操作:将图像从Java客户端发送到Python服务器。 Python服务器从图像中检测到一个对象,并向后发送检测框坐标。服务器必须保持连接状态。

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

当我在Python中收到图像时,我将clientsocket.recv(1024)与while循环一起使用,但是recv正在阻塞并且没有中断循环。 像使用recv(400000)一样一次接收数据,或者在len(data) != 1024时中断数据都可以,但是我想知道是否还有其他方法可以中断循环或接收数据,因为您可能会得到比{大的图像{1}}或4000000的倍数的数据大小。

当我单击UI中的按钮时,Java正在发送图像。如果我使用1024或setblocking`,Python服务器将不会等到我单击按钮进行图像发送后才开始。

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

连接后,我将接收图像并在while循环中发送坐标,因此不必每次发送图像时都重新连接。但是由于发送坐标是在while循环中,因此Java客户端将在while循环中断之前不会接收坐标。

Python服务器:

settimeout

Java客户端:

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)

只要Python服务器仍然存在,Java就会维护连接。只是试图弄清楚如何修复python服务器代码,以便它在接收图像时保持连接并在客户端每次发送图像时发送回坐标。

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

1 个答案:

答案 0 :(得分:0)

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

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

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)

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