[英]How to continuously communicate between Java and Python using TCP socket
我想做的是:将图像从Java客户端发送到Python服务器。 Python服务器从图像中检测到一个对象,并向后发送检测框坐标。 服务器必须保持连接状态。
问题1:接收数据的最佳方法是什么?
当我在Python中收到图像时,我使用带while循环的clientsocket.recv(1024)
,但是recv
阻塞了并且没有中断循环。 立即接收数据,例如使用recv(400000)
或当len(data) != 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)
如果我正确理解您的问题,这将解决您的两个问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.