Python TCP Socket实现文件下载客户端与服务端详解

何川
何川
发布时间:2026-10-13 | 6人浏览过
原创

本文通过Python代码详解基于TCP协议的文件下载实现。涵盖客户端连接、文件请求与接收流程,以及服务器绑定、监听、多客户端处理机制。代码包含完整示例,解析connect、listen、accept等关键API用法,并指出当前版本仅支持小文件传输的局限性。

首先展示相关代码实现。

Python TCP文件下载客户端实现

客户端部分代码。

客户端代码解析


import socket
def main():
  #creat:
  download_client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #link:
  serv_ip=input("please input server IP")
  serv_port=int(input(("please input server port")))
  serv_addr=(serv_ip,serv_port)
  download_client.connect(serv_addr)
  #send and receive
  filename=input("please input filename")
  download_client.send(filename.encode("utf-8"))
  download_data=download_client.recv(1024)
  if download_data:
    with open("receive_"+filename,"wb") as f:
      f.write(download_data)
  download_client.close()
if __name__ == '__main__':
  main()

Python TCP文件下载服务端实现

服务器部分代码。

服务端代码解析


import socket
def send_data(server_socket):
  while True:
    filename = server_socket.recv(1024).decode("utf-8")
    print("用户请求下载对象是%s"%filename)
    if filename:
      with open(filename, "rb") as f:
        file_data = f.read()
        server_socket.send(file_data)
    else:
      server_socket.close()
      break
def main():
  #creat
  server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  #bind
  server.bind(("",4399))
  #listen
  server.listen(128)
  #accept
  while True:
    print("waiting for quest")
    server_socket,client_ip=server.accept()
    print("connected")
    send_data(server_socket)
  #close
  server.close()
if __name__ == '__main__':
  main()

此前曾编写过基于UDP的简单程序,今日学习TCP协议。TCP与UDP的区别与联系已有诸多论述,此处不再赘述。本文采用TCP协议,因其在文件下载场景中应用更为广泛,具备更高的可靠性。以下对客户端代码进行具体分析:

第一点,TCP协议面向连接。客户端发送请求前,必须与服务器建立连接(这与UDP不同)。因此,代码中体现了connect动作以完成连接建立。

第二点,当前程序的recv方法仅支持接收1KB数据。若尝试收发大文件,程序将会出错。关于大文件下载的解决方案,将在后续研究中补充说明。

接下来对服务器代码进行分析:

第一点,服务器必须进行绑定操作,即确定其地址。只有明确了地址,客户端才能知晓每次需与谁建立连接。

第二点,涉及socket的listen方法。在之前的网络编程中,我们通常主动连接他人(如使用connect())。服务器则不同,它处于被动连接状态,等待客户端发起连接。listen方法用于实现这种状态的转换。其后的参数指定了等待队列中最多可容纳的传入连接数。若需确定可指定的最大连接数,需参照MaxConnections值,即等待连接的最大数量。

第三点,accept()方法返回一个元组。前文代码中使用了两个变量对该元组进行拆包。元组的第一个元素是socket对象,第二个元素是连接本服务器的客户端地址。对于新生成的socket对象,可理解为服务器主socket在接到连接后,派遣了一个专用的socket来专门服务于该客户端。

第四点,一个服务器可同时被多个客户端连接。每个客户端都会分配一个专用的socket进行处理和服务。

TCP通信流程总结

总结部分:

客户端流程:创建套接字(可绑定)—连接服务器—收发数据—关闭连接。 服务器流程:创建套接字—绑定地址—监听连接—接收连接—收发数据—关闭连接。

以上为本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表