Python基于Socket实现UDP与TCP网络通信详解
本文详细介绍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编程通常遵循以下步骤:
- 创建一个Socket对象,可选择INET(IPv4)或UNIX域套接字类型,并指定连接方式为TCP或UDP。
- 使用bind()方法绑定一个端口,以便Client端能够连接。
- 设置listen()队列的大小,用于处理待连接的请求。
- 进入无限循环,调用accept()函数等待Client连接。该函数返回一个新的Socket对象,对应于客户端的Socket,从而建立通信信道。对Socket的具体处理通常封装在外部独立函数中,以支持并发处理。
- 通过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端实现流程
- 创建一个新的Socket对象。
- 使用connect()函数与远程主机建立连接。
- 在该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端实现流程
- 创建一个数据报形式的Socket(SOCK_DGRAM)。
- 绑定一个端口,以便Client端连接。
- 开始接收数据,使用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端实现流程
- 创建一个新的数据报Socket。
- 进行数据的发送和接收操作。
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程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













