通过套接字发送大文件

2 python sockets

我有一个视频文件,想通过套接字发送它。视频被发送到客户端,但视频不可播放,并且接收到的视频大小为 2 KB。最重要的是视频大小为 43 MB。问题是什么?

服务器:

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

客户:

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

Mar*_*nen 5

检查的返回值sendrecv。该9000000值是发送/接收的最大值但不保证值。或者,使用sendall.

对于recv,您必须循环直到收到所有数据。如果在发送文件后关闭套接字,recv则在接收到所有数据时将返回零。

仅供参考,while True:由于,您在两个文件中都不会循环break,因此它们是不必要的。

这是应该有用的东西......

服务器.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')
Run Code Online (Sandbox Code Playgroud)

客户端.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.")
Run Code Online (Sandbox Code Playgroud)