【问题标题】:Sending and retrieving an image through socket programming in python在python中通过socket编程发送和检索图像
【发布时间】:2017-05-22 09:40:14
【问题描述】:

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

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

【问题讨论】:

  • 你能把程序的输出也贴出来吗?
  • 我已经这样做了。

标签: python image sockets


【解决方案1】:

很奇怪,在客户端结束之前,服务器能够写入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

在这种交换中,服务器无法知道客户端何时完成发送数据。您应该使用协议来说明这一点。例如,您可以先发送文件的长度,然后再发送数据,服务器就会知道,当它收到正确的字节数时,它可以自己处理。

或者,由于每侧只有一个传输,您可以关闭套接字以先从客户端发送,然后从服务器发送,但通常在较低级别以设置正常关闭。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2016-05-02
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2013-03-23
    • 2013-08-20
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多