Python网络编程Socket实现服务端与客户端操作详解

山海之间
山海之间
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Python中Socket模块的网络编程实现,涵盖TCP与UDP两种协议的服务端及客户端代码示例。内容涉及Socket创建、绑定端口、监听连接、数据收发及异常处理,重点解析Windows环境下的兼容性问题及长连接实现方法,帮助开发者掌握基础网络通信逻辑。

本文详细介绍利用Python标准库socket模块进行网络编程的方法,重点演示如何构建服务端与客户端。

文章主要内容概览:

  • Socket基础概念解析
  • TCP协议示例:
    • TCP协议服务端实现
    • TCP协议客户端实现
  • UDP协议示例:
    • UDP协议服务端实现
    • UDP协议客户端实现

文章首次发布于2018-02-08 01:14

后续更新记录:

  1. 2018-03-20:重构了文章结构,并补充了UDP通信的相关内容

  • Socket(套接字)是网络通信的接口,应用程序通过它向网络发起请求或响应网络请求。
  • 网络中两个程序通过双向通信连接交换数据,该连接的一端被称为一个socket。
  • 可以将Socket类比为电话线插口,只有当插口连接正确时,通信才能建立。
  • 在Python中,使用socket模块进行网络连接的传输操作。


    • 若使用socket模块创建TCP客户端和服务端,需注意以下细节:
      • 使用Socket前需导入模块:import socket
      • 具体的创建流程见下文示例

    服务端代码示例:

    TCP服务端通常包含以下步骤:建立Socket、绑定IP地址和端口、监听端口、等待连接、接收数据、传输数据以及关闭连接。

    • 建立Socket:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM),其中参数默认即为socket.AF_INET和socket.SOCK_STREAM。
    • 绑定端口:server.bind(('IP地址',端口)),注意地址和端口号需组成一个元组(tuple)。
    • 设置监听:server.listen()。
    • 接受连接:conn,addr=server.accept(),该方法返回一个连接实例和一个地址元组,地址为客户端IP,后续数据操作需基于此连接实例进行。
    • 发送数据:conn.send(data),注意发送的数据必须是字节流,因此字符串需先使用encode()编码。
    • 接收数据:conn.recv(size),size指定接收的字节数,若需将接收的字节流转换为Unicode字符串,需使用decode()解码。
    • 关闭连接:close()。
    
    import socket
    server=socket.socket()#建立socket
    server.bind(('localhost',1234))#绑定
    server.listen()#监听
    print("开始等待。。。")
    conn,addr=server.accept()#接收连接
    print("连接成功")
    data=conn.recv(1024)#接收数据
    print(data.decode())
    conn.send(data)#发送数据
    server.close()#关闭连接
    print("--------------------")
    • 上述基础代码存在局限:仅能处理一次连接,结束后服务端Socket即关闭。若需支持连续连接,需修改代码以不立即关闭Socket。
    
    #服务器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #绑定ip和端口
    server.listen(5) #监听
    while True:
      print("开始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客户端连接")
      while True:
        data = conn.recv(1024)
        print("recv:",data)
        if not data: #当data=0时为真
          print("连接断开...")
          break
        conn.send(data)
    server.close()

    注意:上述基础代码在Linux系统中可正常运行,但在Windows系统中可能会报错。

    若需在Windows环境下运行,需添加异常捕获机制。

    
    #服务器端
    import socket
    server = socket.socket()
    server.bind(('localhost',1234)) #绑定ip和端口
    server.listen(5) #监听
    while True:
      print("开始等待")
      conn, addr = server.accept()
      print(conn, addr)
      print("客户端连接")
      while True:
        try:
          data = conn.recv(1024)
          print("recv:",data)
          if not data: #当data=0时为真
            print("连接断开...")
            break
          conn.send(data)
        except ConnectionResetError as e:
          print(e)
          break
    server.close()

    客户端代码示例:

    TCP客户端通常包含以下步骤:建立Socket、连接远程服务端Socket、传输数据、接收数据以及关闭连接。

    • 建立Socket:client=socket.socket()。
    • 建立连接:client.connect(('IP地址',端口)),地址和端口号需组成元组。
    • 发送数据:client.send(data),数据必须为字节流,字符串需先使用encode()编码。
    • 接收数据:client.recv(size),数据为字节流,需使用decode()转换为Unicode字符串。
    • 关闭连接:close()。
    
    import socket
    client=socket.socket()#建立socket
    client.connect(('localhost',1234))#连接
    client.send("你好".encode())#发送数据
    data=client.recv(1024)#接收数据
    print(data.decode())
    client.close()#关闭连接
    • 上述基础代码存在局限:仅能发送一次数据,发送后连接即断开。若需多次发送数据且不自动断开(前提是服务端支持多次接收),需修改代码。
    
    import socket
    client=socket.socket()
    client.connect(('localhost',1234))
    while True:
      cmd=input(">>")
      if len(cmd)==0:
        continue
      client.send(cmd.encode())
      cmd_res=client.recv(1024)
      print(cmd_res.decode())
    client.close()


    UDP服务端代码示例:

    UDP服务端通常包含以下步骤:创建Socket、绑定端口、传输数据以及接收数据。

    • 创建Socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)。
    • 绑定端口:server.bind(addr),其中addr为包含(地址,端口)的元组。
    • 接收数据:data,client_addr=server.recvfrom(1024)。
    • 发送数据:server.sendto(data,client_addr)。
    
    import socket
    import time
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    server.bind(("localhost",1234))
    start_time=time.time()
    while True:
      data,addr=server.recvfrom(1024)
      print(data,addr)
      server.sendto("hello".encode(),addr)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    server.close()

    UDP客户端代码示例:

    UDP客户端通常包含以下步骤:创建Socket、传输数据以及接收数据。

    • 创建Socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)。
    • 发送数据:server.sendto(data,addr),其中addr为包含(地址,端口)的元组。
    • 接收数据:data,server_addr=client.recvfrom(1024)。
    
    import socket,time
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr=("localhost",1234)
    start_time=time.time()
    while True:
      client.sendto(time.ctime().encode(),addr)
      data,addr= client.recvfrom(1024)
      print(data)
      time.sleep(1)
      if time.time()-start_time>30:
        break
    client.close()

更多关于Python网络编程的内容,请参阅本站相关专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望本文所述的代码示例对您的Python程序设计有所帮助。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表