python之socket编程(TCP)-传输文件

概述

通过socket编程,实现下载功能,具体如下:
客户端连接服务器,向服务器发送要下载的文件名,服务器根据文件名读取该文件(如果文件过大,一次读取会内存溢出,所以分块读取),然后向客户端发送数据,客户端接收到后写入磁盘

客户端

# 导入模块
import socket

# 创建套接字
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接
socket.connect(("127.0.0.1", 8080))
filename = input("请输入要下载的文件:")
socket.send(filename.encode('utf-8'))
try:
    file=open(filename, "wb")
    while True:
        # 接收数据
        data = socket.recv(1024)
        if data:
            file.write(data)
        else:
            break
    file.close()
except Exception as e:
    print("下载异常", e)

print(filename, "下载成功")
socket.close()

服务器端

# 导入模块
import socket,threading

class FileThread(threading.Thread):
    def __init__(self,socket,addr):
        super().__init__()
        self._socket=socket
        self._addr=addr

    def run(self):
        print("客户端:", self._addr, "连接")
        # 接收下载的文件名
        file_name_data = self._socket.recv(1024)
        # 对文件名进行解码
        file_name = file_name_data.decode()
        try:
            file=open( file_name, "rb")
            while True:
                # 每次读取1k
                file_data = file.read(1024)
                # 有数据就发送
                if file_data:
                    self._socket.sendall(file_data)
                else:
                    break
        except Exception as e:
            print("传输异常:", e)
        finally:
            file.close()
        # 关闭连接
        self._socket.close()

def main():
    # 创建tcp服务端socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定端口
    server_socket.bind(("0.0.0.0", 8080))
    # 设置监听,把服务端socket由主动套接字改成被动套接字,只能接收客户端的连接请求
    server_socket.listen(5)
    while True:
        # 接收客户端信息
        client_socket, addr = server_socket.accept()
        FileThread(client_socket,addr).start()

if __name__ == "__main__":
    main()

原文出处:/show_1EF2XocGVHkN.html