2012-02-21 16 views
15

私はソケットを実装するPythonでプログラムを作成しようとしています。各クライアントはPDFファイルを送信し、サーバはそれを受け取り、タイトルは "file_number.pdf"に変更されます。 .pdf)。提示される問題は、クライアントだけがファイルを正常に送信できることです。 2番目のクライアントがプログラムを送信しようとするとクラッシュします。何が間違っているのですか?Nクライアント(N < 20)がサーバーに接続してファイルを転送できるようにするためにコードを解決するにはどうすればよいですか?ここでPythonでソケットを通してファイルを送信する

は、サーバーのコードは次のとおりです。私は常にファイル名「libroR.pdf」で書籍を使用する私のコードを簡素化するために

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() 

が、完全に:

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() 

は、ここでクライアントコードですコードはグラフィカルユーザーインターフェイスによって選択されます。

+0

は私たちにエラーを表示し、それがクライアントまたは影響を受けているサーバーであるかどうかを教えて。 – Marcin

+0

@Marcinはエラーを教えてくれません。最初のクライアントだけがファイルを送信し、正常終了し、2番目のクライアントが接続しようとすると、サーバーはさらに多くの要求を待っています。 – franvergara66

答えて

12

sc, address = s.accept()からsc.close()までのすべてのコードを別のループに入れるか、最初のファイルを受信した後にサーバーを終了する必要があります。それはクラッシュしない、スクリプトはちょうど完了です。 s.listen(10)手段 "set maximum accept rate to 10 connections" が、 "10の接続後に停止" ではないこと

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

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):  
    # 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() 

ここ[EDIT]改訂コードです。

+0

ソケットの読み取りループから離れた別のループ?私は明確なアイデアがありません – franvergara66

+0

実際には、s.listen(10)は、「TCPスタックが同時にキューに入れられるまでに最大10個の受け入れられないTCP接続を許可します」という意味です。 10個の入ってくるTCP接続がすでにこのソケットのTCPスタックのキューに入っている場合、追加の接続は拒否されます(プログラムがその中のいくつかの接続をaccept()することによってキューを廃棄するまで) –

1

最初のクライアント接続を処理した後、サーバーソケット(コードでs)を閉じています。したがって、あなたのサーバーによって1つのクライアントしか処理されません。 acceptの周りにループを作り、scから読む。

3

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() 
関連する問題