2012-02-21 136 views
15

我想在Python中制作一个实现套接字的程序,每个客户端发送一个PDF文件并且服务器接收它并将标题改为“file_number.pdf”(即:file_1 .PDF)。提出的问题是,只有客户端才能成功发送文件。当第二个客户端尝试发送程序确实崩溃。我在做什么错了,如何解决我的代码,让N个客户端(连接N < 20)连接到服务器并传输文件?通过Python中的套接字发送文件

这里的服务器代码:

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”,但在全代码是由图形用户界面选择的。

+0

显示我们的错误,并告诉我们,无论是客户端或受影响的服务器。 – Marcin 2012-02-21 17:21:54

+0

@Marcin不会教我任何错误,只是第一个客户端发送文件并成功结束,并且服务器继续等待更多请求,当第二个客户端尝试连接时,客户端程序无需任何操作并保持待机状态。 – franvergara66 2012-02-21 17:25:26

回答

12

您必须将所有从sc, address = s.accept()sc.close()的代码放到另一个循环中,或者服务器在收到第一个文件后简单地终止。它不会崩溃,脚本刚刚完成。

[编辑]这里是修改后的代码:

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

注意s.listen(10)意思是 “set maximum accept rate to 10 connections”,而不是 “后10个连接停止”。

+0

除了套接字读取循环之外的另一个循环?我没有清楚的想法 – franvergara66 2012-02-21 17:52:07

+0

实际上s.listen(10)的意思是“允许多达10个未接受的TCP连接被TCP堆栈同时排队”。如果有10个传入的TCP连接已经在此套接字的TCP堆栈的队列中,则任何附加的连接都将被拒绝(直到程序通过accept()其中的一些连接排空队列) – 2013-08-05 18:39:06

1

在处理第一个客户端连接之后,您正在关闭服务器套接字(代码中为s)。因此,您的服务器只能处理一个客户端。围绕accept循环并从sc读取。

3

您的代码在第二个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()