通过Python中的套接字发送文件

fra*_*a66 20 python sockets

我正在尝试在Python中创建一个实现套接字的程序,每个客户端发送一个PDF文件,服务器接收它,标题更改为"file_number.pdf"(即:file_1.pdf).提出的问题是只有客户端才能成功发送文件.当第二个客户端尝试发送程序时崩溃.我做错了什么,如何解决我的代码以允许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()
Run Code Online (Sandbox Code Playgroud)

这是客户端代码:

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()
Run Code Online (Sandbox Code Playgroud)

为了简化我的代码,我总是使用一个文件名为"libroR.pdf"的书,但在完整的代码中,它是由图形用户界面选择的.

Aar*_*lla 16

您必须将所有代码从sc, address = s.accept()最高位置sc.close()放到另一个循环中,否则服务器会在收到第一个文件后终止.它没有崩溃,脚本刚刚完成.

[编辑]以下是修订后的代码:

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()
Run Code Online (Sandbox Code Playgroud)

请注意,这s.listen(10)意味着" 将最大接受率设置为10个连接 ",而不是"在10个连接后停止".

  • 实际上 s.listen(10) 的意思是“允许最多 10 个未接受()的传入 TCP 连接同时由 TCP 堆栈排队”。如果该套接字的 TCP 堆栈队列中已存在 10 个传入 TCP 连接,则任何其他连接都将被拒绝(直到程序通过accept() 处理队列中的某些连接来耗尽队列) (2认同)