通过python中的套接字编程发送和检索图像

时间:2017-05-22 09:40:15

标签: python image sockets

我试图编写代码将图像发送到服务器,修改它并将其发送回客户端。我以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

这是我让代码在中断之前运行大约两分钟后的输出。

1 个答案:

答案 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在较低级别设置正常关闭。