Отправить файл через сокеты в Python - PullRequest
20 голосов
/ 21 февраля 2012

Я пытаюсь создать программу на Python, которая реализует сокеты, каждый клиент отправляет файл PDF, и сервер получает его, и название изменяется на «file_number.pdf» (то есть: file_1.pdf).Проблема заключается в том, что только клиент может успешно отправить файл.Когда второй клиент пытается отправить программу, происходит сбой.Что я делаю не так и как я могу решить свой код, чтобы позволить N клиентам (с N <20) подключаться к серверу и передавать файлы? </p>

Вот код сервера:

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", но в полном коде она выбирается графическим интерфейсом пользователя.

Ответы [ 4 ]

16 голосов
/ 21 февраля 2012

Вы должны поместить весь код от 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 соединений».

4 голосов
/ 05 августа 2013

Ваш код застревает во втором цикле 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()
1 голос
/ 21 февраля 2012

Вы закрываете сокет сервера (s в вашем коде) после обработки первого клиентского соединения.Таким образом, только один клиент когда-либо обрабатывается вашим сервером.Сделайте цикл вокруг accept и читайте с sc.

0 голосов
/ 05 сентября 2018

Используя этот код, вы можете отправлять файлы несколько раз, используя один и тот же 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...