2012-02-21 45 views
15

Tôi đang cố gắng tạo một chương trình bằng Python thực hiện các ổ cắm, mỗi máy khách gửi một tệp PDF và máy chủ nhận nó và tiêu đề được đổi thành "file_number.pdf" (ví dụ: tệp_1 .pdf). Vấn đề được trình bày là chỉ có một khách hàng có thể gửi một tập tin thành công. Khi một khách hàng thứ hai cố gắng gửi chương trình bị lỗi. Tôi đang làm gì sai và làm thế nào tôi có thể giải quyết mã của tôi để cho phép N khách hàng (với N < 20) để kết nối với máy chủ và chuyển các tập tin?Gửi tệp qua ổ cắm bằng Python

Dưới đây là đoạn code server:

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

Đây là mã khách hàng:

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

Để đơn giản hóa mã của tôi tôi luôn luôn sử dụng một cuốn sách với tên file "libroR.pdf", nhưng trong toàn mã nó được chọn bởi một giao diện người dùng đồ họa.

+0

Hiện chúng tôi các lỗi, và cho chúng tôi biết cho dù đó là khách hàng hoặc máy chủ mà bị ảnh hưởng. – Marcin

+0

@Marcin không dạy cho tôi bất kỳ lỗi nào, chỉ khách hàng đầu tiên gửi tệp và kết thúc thành công và máy chủ tiếp tục chờ thêm yêu cầu, khi khách hàng thứ hai cố gắng kết nối, chương trình khách hàng không làm gì cả và vẫn ở chế độ chờ. – franvergara66

Trả lời

12

Bạn phải đặt tất cả mã từ sc, address = s.accept() tối đa sc.close() vào vòng lặp khác hoặc máy chủ chỉ cần chấm dứt sau khi nhận tệp đầu tiên. Nó không sụp đổ, kịch bản vừa kết thúc.

[EDIT] Đây là mã sửa đổi:

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

Lưu ý rằng s.listen(10) có nghĩa là "set maximum accept rate to 10 connections", không phải "dừng lại sau 10 kết nối".

+0

một vòng lặp khác với vòng lặp đọc socket? Tôi không có ý tưởng rõ ràng – franvergara66

+0

Trên thực tế s.listen (10) có nghĩa là "cho phép lên đến 10 un-accept() ed kết nối TCP đến được xếp hàng đợi bởi TCP stack cùng một lúc". Nếu 10 kết nối TCP đến đã có trong hàng đợi của ngăn xếp TCP cho socket này, bất kỳ thứ gì thêm sẽ bị từ chối (cho đến khi chương trình rút hàng đợi bằng cách chấp nhận() ing một số kết nối trong đó) –

1

Bạn đang đóng chốt máy chủ (s trong mã của mình) sau khi xử lý kết nối máy khách đầu tiên. Vì vậy, chỉ có một khách hàng được xử lý bởi máy chủ của bạn. Tạo vòng lặp quanh accept và đọc từ sc.

3

Mã của bạn bị kẹt trong vòng lặp thứ hai.

Xem:

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() 
Các vấn đề liên quan