0

我对这段代码有一些问题......发送的不是整数图像而是一些字节,有没有人可以帮助我?我想发送我在文件夹中找到的所有图像。谢谢你。

客户

import socket
import sys
import os

s = socket.socket()
s.connect(("localhost",9999))       #IP address, port
sb = 'c:\\python27\\invia'

os.chdir(sb)                        #path

dirs =os.listdir(sb)                #list of file
print dirs

for file in dirs:
   f=open(file, "rb")               #read image
   l = f.read()
   s.send(file)                     #send the name of the file
   st = os.stat(sb+'\\'+file).st_size  
   print str(st)
   s.send(str(st))                  #send the size of the file
   s.send(l)                        #send data of the file
   f.close()
s.close()

服务器

import socket
import sys
import os

s = socket.socket()
s.bind(("localhost",9999))
s.listen(4)                             #number of people than can connect it
sc, address = s.accept()

print address
sb = 'c:\\python27\\ricevi'

os.chdir(sb)
while True:
    fln=sc.recv(5)                      #read the name of the file
    print fln
    f = open(fln,'wb')                  #create the new file
    size = sc.recv(7)                   #receive the size of the file
    #size=size[:7]
    print size
    strng = sc.recv(int(size))          #receive the data of the file 
    #if strng:
    f.write(strng)                      #write the file
    f.close()
sc.close()
s.close()   
4

2 回答 2

1

要通过单个套接字传输一系列文件,您需要某种方式来描述每个文件。实际上,您需要在套接字之上运行一个小协议,它允许您了解每个文件的元数据,例如其大小和名称,当然还有图像数据。

您似乎正在尝试这样做,但是发送者和接收者都必须就协议达成一致。

您的发件人中有以下内容:

s.send(file)                     #send the name of the file
st = os.stat(sb+'\\'+file).st_size  
s.send(str(st))                  #send the size of the file
s.send(l)

接收方如何知道文件名的长度?或者,接收者如何知道文件名的结尾在哪里,以及文件的大小从哪里开始?你可以想象接收者获得一个类似的字符串foobar.txt8somedata并且不得不推断文件的名称是foobar.txt,文件是包含数据的 8 字节长somedata

您需要做的是用某种分隔符分隔数据,例如\n指示每条元数据的边界。

您可以将数据包结构设想为<filename>\n<file_size>\n<file_contents>. 来自发送器的示例数据流可能如下所示:

foobar.txt\n8\nsomedata

然后接收器将解码传入的流,\n在输入中查找以确定每个字段的值,例如文件名和大小。

另一种方法是为文件名和大小分配固定长度的字符串,然后是文件的数据。

于 2013-06-03T12:03:51.667 回答
0

该参数socket.recv仅指定接收数据包的最大缓冲区大小,并不意味着将读取多少字节。

所以如果你写:

strng = sc.recv(int(size))

你不一定会得到所有的内容,特别是如果size相当大。

您需要在循环中从套接字读取,直到您实际读取size字节以使其工作。

于 2013-06-03T11:11:36.453 回答