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、ファイル名やサイズなどの各フィールドの値を決定します。

もう 1 つの方法は、ファイル名とサイズに固定長の文字列を割り当て、その後にファイルのデータを割り当てることです。

于 2013-06-03T12:03:51.667 に答える
0

パラメーター tosocket.recvは、データ パッケージを受信するための最大バッファー サイズのみを指定します。これは、正確に何バイトが読み取られるかを意味するものではありません。

したがって、次のように書くと:

strng = sc.recv(int(size))

size特にがかなり大きい場合は、必ずしもすべてのコンテンツを取得できるとは限りません。

size実際にバイトを読み取って機能させるまで、ソケットからループで読み取る必要があります。

于 2013-06-03T11:11:36.453 に答える