Отправить файл через сокеты в Python
Я пытаюсь сделать программу на 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()
Здесь код клиента:
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", но в полном коде он выбирается графическим интерфейсом пользователя.
Ответы
Ответ 1
Вы должны поместить весь код из 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()
Обратите внимание, что s.listen(10)
означает " установить максимальную скорость приема на 10 подключений ", а не "останавливать после 10 подключений".
Ответ 2
Ваш код застревает во втором цикле.
Видеть:
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()
Ответ 3
Вы закрываете сокет сервера (s
в коде) после обработки первого клиентского соединения. Таким образом, только один клиент когда-либо обрабатывается вашим сервером. Сделайте петлю вокруг accept
и чтения из sc
.
Ответ 4
Используя этот код, вы можете отправлять файлы несколько раз, используя один и тот же 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()