在 Python 中通过套接字发送 png 文件
Sending png file via socket in Python
我正在使用 python 版本 2.7.9,我尝试发送 png 文件。
但是发生了一些奇怪的事情..我使用套接字并发送 post 请求(或某种)。
我从客户端向服务器发送请求,然后打印在服务器上收到的请求的长度,例如长度 is:1051.
然后我做一个正则表达式取png文件数据,然后打印长度,长度是2632,他比响应大?!
我觉得问题是写的是内容,而不是表示权,我试过各种方法都没有用,所以我在这里问一下如何解决这个问题。
服务器源代码:
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()
首先,您应该使用while True
接收完整数据:
res = ''
while True:
data = client.recv(1024)
if not data:
break
res += data
print len(res)
那么,re.findall
其实returns是一个数组,不是字符串。所以你应该这样做:
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
这就是文件变大的原因。
我正在使用 python 版本 2.7.9,我尝试发送 png 文件。 但是发生了一些奇怪的事情..我使用套接字并发送 post 请求(或某种)。 我从客户端向服务器发送请求,然后打印在服务器上收到的请求的长度,例如长度 is:1051.
然后我做一个正则表达式取png文件数据,然后打印长度,长度是2632,他比响应大?!
我觉得问题是写的是内容,而不是表示权,我试过各种方法都没有用,所以我在这里问一下如何解决这个问题。
服务器源代码:
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()
首先,您应该使用while True
接收完整数据:
res = ''
while True:
data = client.recv(1024)
if not data:
break
res += data
print len(res)
那么,re.findall
其实returns是一个数组,不是字符串。所以你应该这样做:
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
这就是文件变大的原因。