【问题标题】:Sending png file via socket in Python在 Python 中通过套接字发送 png 文件
【发布时间】:2015-07-10 19:51:19
【问题描述】:

我使用的是 python 版本 2.7.9,我尝试发送 png 文件。 但是发生了一些奇怪的事情......我使用套接字并发送一个发布请求(或某种)。 我从客户端向服务器发送请求,然后打印服务器接收到的请求的长度,例如长度为:1051。

然后我做一个regex取png文件数据,然后打印长度,长度是2632,那他比response大?!

我认为问题在于它实际上是写内容,而不是代表权,我尝试了不同的东西但它们都不起作用,所以我在这里问如何解决这个问题。

服务器源代码:

import socket
import re

server = socket.socket()
server.bind(('0.0.0.0',8080))

while True:
    server.listen(2)
    (client, client_addr) = server.accept()
    print 'IP :',client_addr

    res = client.recv(0xfffffff)
    print len(res)

    #get file name
    file_name = res.split('&')[0]
    file_name = str(file_name.split('=')[1])
    print repr(res)

    #get the data of the file
    raw_img = str(re.findall("&photo_data=(.*)" ,res ,re.DOTALL))

    print "File name:" + file_name
    print "Size:" + str(len(raw_img))
    with open(file_name, 'wb') as f:
        f.write(raw_img)

    print "Done"

客户端源码:

import socket

client = socket.socket()
client.connect(('127.0.0.1',8080))

raw_data = open('test.png', 'rb').read()
save_file_name = raw_input("Enter the file name:")
print len(raw_data)

output = 'POST /upload HTTP/1.1\r\n'
output += 'Content-Length:' + str(len(raw_data)) + str(len(save_file_name)) + '\r\n\r\n'
output += 'file_name=' + save_file_name + '&'
output += 'photo_data=' + raw_data
print len(output)

client.send(output)
client.close()

【问题讨论】:

  • 问题是你为什么使用原始套接字?有图书馆会为你处理它。特别是因为您似乎已经接受了类似休息的格式,您可以只使用瓶子作为休息服务器和请求作为客户端。
  • 它是学习网络的一部分,所以目前我不使用准备好的库..
  • 你是说服务器收到的数据比预期的少吗?与文件不同,套接字返回较小的数据块,因此res = client.recv(0xfffffff) 可能不是完整的 png。继续循环读取套接字,直到它返回一个零长度的字符串。
  • 没有,但是数据过滤后变大了。

标签: python sockets png send


【解决方案1】:

首先,您应该使用while True 接收完整数据:

res = ''
while True:
    data = client.recv(1024)
    if not data:
        break
    res += data
print len(res)

然后,re.findall 实际上返回一个数组,而不是字符串。所以你应该这样做:

r = re.findall("&photo_data=(.*)" ,res ,re.DOTALL)
raw_img = str(r[0])

现在可以正常使用了。


为什么之前的代码不起作用?假设我们有一个列表:

r = ['\x45']

raw_img部分的数据基本是这样的。如果我们将此列表粗暴地转换为 str,我们有:

print len(str[r]))  # ['E'], 5

其实我们需要的是r[0]:

print len(str[r[0])) # 1

这就是文件变大的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2015-08-28
    • 2021-07-06
    • 1970-01-01
    • 2012-05-11
    • 2019-08-12
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多