利用socket 制做一个简易下载器模型(TCP)

下载其实需要两个模型,一是服务器方,作为应答及发送数据,另一个模型则是客户端方,发起下载请求且下载服务器发送的数据,有了这个概念基本上就可以写了。

1、客户端方代码

import socket

def main():
    # 创建套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #  socket创建套接字,DGRAM为UDP,STREAM为TCP

    # 输入需要绑定的服务器信息
    dest_ip = input("请输入服务器ip:")

    dest_port =int(input("请输入服务器porti:"))

    # 绑定服务器
    tcp_socket.connect((dest_ip,dest_port))   #  TCP需要绑定服务器IP端口,这点需要与UDP区分

    # 输入需要下载的文件名字
    file_name = input("请输入你要下载的文件名:")
    tcp_socket.send(file_name.encode('utf-8'))
    # 收到信息并且下载
    data =  tcp_socket.recv(1024*1024)
    with open (''+file_name,'wb') as f:
        f.write(data)

    # 关闭套接字
    tcp_socket.close()


if __name__ == '__main__':
    main()

2、服务器代码

import socket

def main():
    # 创建套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 绑定本地信息
    local_addr = ('',8080)
    tcp_socket.bind(local_addr)


    # 监听
    tcp_socket.listen(128)  #  TCP服务器具有监听,等待连接的环节
    
    # 提供下载服务
    new_client,client_addr = tcp_socket.accept()  # 等待连接环节,如果有客户端连接则返回一个元祖,元祖[0]是接下来收发信息使用的新套接字,元祖[1]则是连接的客户端地址
    file_name =  new_client.recv(1024).decode('utf-8')
    print('链接成功,来自%s' %(str(client_addr)))
    try:
        f = open(file_name,'rb')
        data = f.read()
    except Exception as t:
        print("文件名错误%s" %(t))
    new_client.send(data)
    new_client.close()
    tcp_socket.close()


if __name__ == "__main__":
    main()

以上代码,在linux上直接运行两个终端即可进行

猜你喜欢

转载自www.cnblogs.com/oslo254804746/p/11870531.html