我试图编写代码将图像发送到服务器,修改它并将其发送回客户端。我以1024块长度的块发送图像。想法是在服务器端使用Opencv进行一些图像编辑,然后将图像发送回客户端。但是,我的客户端代码每次在接收图像之前都会暂停执行。我觉得这是一个同步问题。客户端在服务器创建映像文件(Client.py)之前调用recv。 我的服务器端代码:
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
print("Server is ready to service...")
while 1:
connectionSocket, addr = serverSocket.accept()
res = ''
while 1:
t = connectionSocket.recv(1024)
if not t:
break
res += t
g = open("Client.jpg", "wb")
g.write(res)
g.close()
print("Image received and recreated")
f = open("Client.jpg", "rb")
#print(len(f))
print("Sending image data...")
while 1:
print("In while")
#data = f.read(1024)
if not data:
break
connectionSocket.send(data)
print("Data sent:"+str(len(data)))
connectionSocket.close()
客户端代码:
from socket import *
import time
serverName = 'localhost'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
Image = open("BG.jpg", "rb")
print("Sending image data...")
while 1:
data = Image.read(1024)
if not data:
break
clientSocket.send(data)
#print(len(data))
print("Data has been sent!")
print("-------------------")
time.sleep(3)
print("Receving data")
res = ''
while 1:
print("in while")
t = clientSocket.recv(1024)
print(len(t))
if not t:
break
res += t
g = open("Response.jpg", "wb")
g.write(res)
g.close()
clientSocket.close()
如果我需要提供更多信息,请告诉我。
双方的产出都不多。 客户端输出:
Sending image data...
Data has been sent!
-------------------
Receving data
in while
服务器端输出:
Server is ready to service...
Image received and recreated
Sending image data...
In while
这是我让代码在中断之前运行大约两分钟后的输出。
答案 0 :(得分:0)
很奇怪服务器能够在客户端结束之前编写Image received and recreated
,因为在代码关闭或关闭之前,代码包含循环读取:
while 1:
t = connectionSocket.recv(1024)
if not t: # t should be empty only when the socket is shut down or closed...
break
res += t
在这种交换中,服务器无法知道客户端何时完成数据发送。您应该使用协议来说明这一点。例如,您可以首先发送文件的长度,然后发送数据,服务器会知道当它收到正确的字节数时,它可以自己进行处理。
或者,由于每侧只有一个传输,您可以关闭套接字以便首先从客户端发送,然后从服务器发送,但不正确使用通常使用的shut
在较低级别设置正常关闭。