web-dev-qa-db-ja.com

Pythonのソケットを介してファイルを送信します

Pythonソケットを実装するプログラムを作成しようとしています。各クライアントはPDFファイルを送信し、サーバーはそれを受信し、タイトルは " file_number.pdf "(ie:file_1.pdf)。提示された問題は、クライアントだけがファイルを正常に送信できるということです。2番目のクライアントがプログラムを送信しようとするとクラッシュします。 Nクライアント(N <20)がサーバーに接続してファイルを転送できるようにするには?

サーバーコードは次のとおりです。

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.
sc, address = s.accept()

print address
i=1
f = open('file_'+ str(i)+".pdf",'wb') # Open in binary
i=i+1
while (True):

    # Recibimos y escribimos en el fichero
    l = sc.recv(1024)
    while (l):
        f.write(l)
        l = sc.recv(1024)
f.close()

sc.close()
s.close()

クライアントコードは次のとおりです。

import socket
import sys

s = socket.socket()
s.connect(("localhost",9999))
f = open ("libroR.pdf", "rb")
l = f.read(1024)
while (l):
    s.send(l)
    l = f.read(1024)
s.close()

コードを簡素化するために、ファイル名が「libroR.pdf」のブックを常に使用しますが、完全なコードではグラフィカルユーザーインターフェイスによって選択されます。

20
franvergara66

sc, address = s.accept()からsc.close()までのすべてのコードを別のループに入れる必要があります。そうしないと、サーバーは最初のファイルを受信した後に単純に終了します。クラッシュせず、スクリプトは終了しました。

[EDIT]修正されたコードは次のとおりです。

_import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Accepts up to 10 connections.

while True:
    sc, address = s.accept()

    print address
    i=1
    f = open('file_'+ str(i)+".pdf",'wb') #open in binary
    i=i+1
    while (True):       
    # receive data and write it to file
        l = sc.recv(1024)
        while (l):
                f.write(l)
                l = sc.recv(1024)
    f.close()


    sc.close()

s.close()
_

s.listen(10)は、「10接続後に停止」ではなく、「 最大接続レートを10接続に設定 」を意味することに注意してください。

16
Aaron Digulla

コードが2番目のwhileループでスタックしています。

見る:

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10)

i=1

while True:
    sc, address = s.accept()

    print address

    f = open('file_'+str(i)+".pdf",'wb') #open in binary
    i=i+1
    print(i)
    l = 1
    while(l):
        l = sc.recv(1024)
        while (l):
            f.write(l)
            l = sc.recv(1024)
        f.close()


    sc.close()

s.close()
4
user2059807

最初のクライアント接続を処理した後、サーバーソケット(コードのs)を閉じています。したがって、サーバーで処理されるクライアントは1つだけです。 acceptをループし、scから読み取ります。

1

このコードを使用すると、同じclient.pyを使用してファイルを複数回送信できます

Server.py

import socket
import sys
s = socket.socket()
s.bind(("localhost",9999))
s.listen(10) # Acepta hasta 10 conexiones entrantes.

i = 1
while True:
    sc, address = s.accept()

    print address
    f = open('file_'+ str(i)+".wav",'wb') #open in binary
    i=i+1
    while (True):
        # recibimos y escribimos en el fichero
        l = sc.recv(1024)
        f.write(l)

        if not l:
            break

    f.close()
    sc.close()
    print('copied the file.')

s.close()
0
user2973566