Python отправляет большой файл через сокет (отправка файла video.mp4) - PullRequest
1 голос
/ 18 мая 2019

У меня есть видеофайл, и я хочу отправить его через сокет. Видео отправляется клиенту, но видео не воспроизводится, а размер получаемого видео составляет 2 КБ. А остро размер видео составляет 43 МБ. в чем проблема? Помоги мне! вот мой код.

Сервер:

import socket

try:

    soc = socket.socket()
    print('socked created.')
    host = ''
    port = 8080

    soc.bind((host, port))
    print('soc bound.')

    soc.listen(10)
    print('waiting for connecting...')

    con, addr = soc.accept()
    print('server connected to IP: ' + addr[0] + " port: " + str(addr[1]))

    while True:

        filename = input('enter filename: ')
        file = open(filename, 'rb')
        sendfile = file.read(9000000)
        con.send(sendfile)
        print("file has been send.")
        break

    con.close()
    soc.close()

except socket.error as err:
    print('error ', str(err))

клиент:

import socket

soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('socked created. waiting for connecting to server...')

server_address = ("192.168.1.3", 8080)

soc.connect(server_address)
print('connected to the server.')

while True:
    recvfile = soc.recv(9000000)
    savefilebyname = input("enter file name: ")
    openfile = open(savefilebyname, 'wb')
    openfile.write(recvfile)
    openfile.close()
    break

print("File has been received.")

soc.close()

1 Ответ

1 голос
/ 18 мая 2019

Проверьте возвращаемое значение send и recv. Значение 9000000 - это максимум , но не гарантированное значение для отправки / записи. Или используйте sendall.

Для recv вы должны зацикливаться, пока не получите все данные. Если вы закроете сокет после отправки файла, recv вернет ноль при получении всех данных.

К вашему сведению, ваш while True: в обоих файлах никогда не зацикливается из-за break, поэтому они не нужны.

Вот кое-что, что должно работать ...

server.py

import socket

soc = socket.socket()
soc.bind(('',8080))
soc.listen(1)

print('waiting for connection...')
with soc:
    con,addr = soc.accept()
    print('server connected to',addr)
    with con:
        filename = input('enter filename to send: ')
        with open(filename, 'rb') as file:
            sendfile = file.read()
        con.sendall(sendfile)
        print('file sent')

client.py

import socket

soc = socket.socket()
soc.connect(('localhost',8080))
savefilename = input("enter file name to receive: ")
with soc,open(savefilename,'wb') as file:
    while True:
        recvfile = soc.recv(4096)
        if not recvfile: break
        file.write(recvfile)
print("File has been received.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...