Python基于Socket实现UDP与TCP网络通信详解

闻溪
闻溪
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍Python中基于Socket库实现TCP和UDP网络通信的方法。涵盖Server与Client端的完整代码示例,解析Socket创建、绑定、监听及数据收发流程,对比TCP与UDP的特性差异,并提供运行结果分析,帮助开发者快速掌握Python网络编程基础。

Python Socket网络通信概述

本文通过具体实例,展示如何使用Python的Socket模块实现UDP和TCP两种网络通信功能,供读者参考学习。

服务器端(Server)代码示例如下:


import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)
while True:
  data, addr = s.recvfrom(2048)
  if not data:
    print "client has exist"
    break
  print "received:", data, "from", addr
s.close()

客户端(Client)代码示例如下:


import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
  msg = raw_input()
  if not msg:
    break
  s.sendto(msg, address)
s.close()

程序运行后的输出结果如下:

服务器端运行日志:

[work@db-testing python]$ python udp_ss.py received: aaaaaa from ('127.0.0.1', 10169) received: 123456 from ('127.0.0.1', 10169) received: abcdef from ('127.0.0.1', 10169)

客户端运行日志:

[work@db-testing python]$ python udp_cc.py aaaaaa 123456 abcdef [work@db-testing python]$

Python网络编程基础

前言

Python以其便捷性、易用性、丰富的第三方库支持以及简洁的语法,成为开发人员的首选工具。本文记录了周末对Python网络编程能力的探索过程,旨在整理相关知识点以便后续查阅。

Python支持基于BSD Socket的网络编程,其API设计与C语言中的Socket接口相似。接下来将分别介绍TCP通信模式,涉及Server端和Client端的实现细节。

TCP通信实现详解

TCP通信模式

Server端实现流程

Server端的Socket编程通常遵循以下步骤:

  1. 创建一个Socket对象,可选择INET(IPv4)或UNIX域套接字类型,并指定连接方式为TCP或UDP。
  2. 使用bind()方法绑定一个端口,以便Client端能够连接。
  3. 设置listen()队列的大小,用于处理待连接的请求。
  4. 进入无限循环,调用accept()函数等待Client连接。该函数返回一个新的Socket对象,对应于客户端的Socket,从而建立通信信道。对Socket的具体处理通常封装在外部独立函数中,以支持并发处理。
  5. 通过send()和recv()方法对Socket进行读写操作。

以下是具体的代码示例:

netserver.py 文件内容


#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    sock.listen(5)
    while True:
      clientSock, (remoteHost, remotePort) = sock.accept()
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      revcData = clientSock.recv(1024)
      sendDataLen = clientSock.send("this is send data from server")
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
      clientSock.close()
if __name__ == "__main__":
  netServer = NetServer()
  netServer.tcpServer()

Client端实现流程

  1. 创建一个新的Socket对象。
  2. 使用connect()函数与远程主机建立连接。
  3. 在该Socket上进行I/O操作,发送和接收数据。

netclient.py 文件内容


#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSock.connect(('localhost', 9527))
    sendDataLen = clientSock.send("this is send data from client")
    recvData = clientSock.recv(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  netClient = NetClient()
  netClient.tcpclient()

运行结果说明:

1) 启动顺序:先运行 netserver.py,再运行 netclient.py。注意Client端需先发送后接收,Server端需先接收后发送,两者顺序需交错进行。

2) Server端打印结果示例:

[127.0.0.1:55279] connect revcData: this is send data from client sendDataLen: 30

3) Client端打印结果示例:

sendDataLen: 29 recvData: this is send data from server

从代码量可以看出Python的简洁性。若将此示例改造成文件传输工具,预计只需增加不到20行代码即可实现。

UDP通信实现详解

UDP通信模式

UDP被称为无连接传输协议,相比TCP更为简单,无需三次握手和错误重传机制。发送方只管发送,接收方只管接收,不保证送达、顺序或完整性。尽管存在这些限制,UDP的速度通常比TCP快,适用于对数据帧要求不高的场景,如网络视频和音频传输。

UDP Server端实现流程

  1. 创建一个数据报形式的Socket(SOCK_DGRAM)。
  2. 绑定一个端口,以便Client端连接。
  3. 开始接收数据,使用recvfrom()方法。

udpserver.py 文件内容


#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    while True:
      revcData, (remoteHost, remotePort) = sock.recvfrom(1024)
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      sendDataLen = sock.sendto("this is send data from server", (remoteHost, remotePort))
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
    sock.close()
if __name__ == "__main__":
  udpServer = UdpServer()
  udpServer.tcpServer()

需要注意的是,在Server端的address元组中,空字符串表示接受来自任何地址的数据报;而在TCP示例中,这表示接受来自任意地址的连接请求。

UDP Client端实现流程

  1. 创建一个新的数据报Socket。
  2. 进行数据的发送和接收操作。

udpclient.py 文件内容


#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sendDataLen = clientSock.sendto("this is send data from client", ('localhost', 9527))
    recvData = clientSock.recvfrom(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  udpClient = UdpClient()
  udpClient.tcpclient()

运行结果说明:

1) 启动顺序:先运行 udpserver.py,再运行 udpclient.py。确保Client端先发送后接收,Server端先接收后发送。

2) Server端结果(Client连续发送三次请求):

[127.0.0.1:37219] connect revcData: this is send data from client sendDataLen: 30 [127.0.0.1:57622] connect revcData: this is send data from client sendDataLen: 30 [127.0.0.1:52290] connect revcData: this is send data from client sendDataLen: 30

3) Client端结果:

sendDataLen: 29 recvData: ('this is send data from server', ('127.0.0.1', 9527))

Socket编程总结与建议

文中提供的示例已具备网络程序的基本结构。在实际应用中,应根据需求扩展对Socket的处理。Socket在概念上与文件句柄、文件描述符和管道描述符类似,均可进行I/O处理。在UNIX类系统中,对Socket的操作与对文件句柄的操作在形式上无差异。

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

希望本文所述对大家Python程序设计有所帮助。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表