Python Socket网络编程:UDP与TCP通信实战及退出机制
本文通过Python3实现Socket网络编程,涵盖UDP与TCP通信的完整示例。重点解决TCP服务端无法优雅退出的问题,通过添加quit命令实现程序安全退出,并提供客户端与服务端的交互代码。
Python Socket网络编程基础
Python内置了强大的Socket库,支持网络通信。我们可以利用它快速构建UDP和TCP通信模型。以下示例均基于Python3版本,涉及网络端口绑定、数据收发及连接管理。
UDP通信示例
UDP(用户数据报协议)是一种无连接的通信方式,适合快速数据传输。下面分别展示服务端和客户端的实现。
UDP服务端
服务端需要绑定指定端口,并持续监听来自任何发送者的数据。以下代码演示了如何接收并打印UDP数据:
import socket
port=8081
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#从指定的端口,从任何发送者,接收UDP数据
s.bind(('',port))
print('正在等待接入...')
while True:
#接收一个数据
data,addr=s.recvfrom(1024)
print('Received:',data,'from',addr)UDP客户端
客户端通过指定主机和端口,向服务端发送数据。示例如下:
import socket
port=8081
host='localhost'
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(b'hello,this is a test info !',(host,port))TCP通信示例
TCP(传输控制协议)提供面向连接的可靠通信。以下示例展示了基础的TCP服务端和客户端实现,但需注意原始TCP方式存在无法优雅退出程序的问题。
基础TCP服务端
服务端监听指定端口,接受客户端连接并回显时间戳和接收到的数据。代码如下:
#-*- coding: utf-8 -*-
from socket import *
from time import ctime
HOST=''
PORT=12345
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)
sock.bind(ADDR)
sock.listen(5)
while True:
print('waiting for connection')
tcpClientSock, addr=sock.accept()
print('connect from ', addr)
while True:
try:
data=tcpClientSock.recv(BUFSIZ)
except:
print(e)
tcpClientSock.close()
break
if not data:
break
s='Hi,you send me :[%s] %s' %(ctime(), data.decode('utf8'))
tcpClientSock.send(s.encode('utf8'))
print([ctime()], ':', data.decode('utf8'))
tcpClientSock.close()
sock.close()基础TCP客户端
客户端连接到服务端,发送用户输入并接收回显数据。示例如下:
#-*- coding: utf-8 -*-
from socket import *
class TcpClient:
HOST='127.0.0.1'
PORT=12345
BUFSIZ=1024
ADDR=(HOST, PORT)
def __init__(self):
self.client=socket(AF_INET, SOCK_STREAM)
self.client.connect(self.ADDR)
while True:
data=input('>')
if not data:
break
self.client.send(data.encode('utf8'))
data=self.client.recv(self.BUFSIZ)
if not data:
break
print(data.decode('utf8'))
if __name__ == '__main__':
client=TcpClient()改进:支持quit命令退出
原始TCP示例中,程序无法通过特定命令优雅退出。以下改进版本添加了quit命令支持,允许用户通过发送“quit”(忽略大小写)来终止服务端和客户端程序。
改进版TCP服务端
服务端在接收数据后检查是否包含“quit”命令,若包含则设置退出标志并关闭连接。代码如下:
#-*- coding: utf-8 -*-
from socket import *
from time import ctime
from time import localtime
import time
HOST=''
PORT=1122 #设置侦听端口
BUFSIZ=1024
ADDR=(HOST, PORT)
sock=socket(AF_INET, SOCK_STREAM)
sock.bind(ADDR)
sock.listen(5)
#设置退出条件
STOP_CHAT=False
while not STOP_CHAT:
print('等待接入,侦听端口:%d' % (PORT))
tcpClientSock, addr=sock.accept()
print('接受连接,客户端地址:',addr)
while True:
try:
data=tcpClientSock.recv(BUFSIZ)
except:
#print(e)
tcpClientSock.close()
break
if not data:
break
#python3使用bytes,所以要进行编码
#s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))
#对日期进行一下格式化
ISOTIMEFORMAT='%Y-%m-d %X'
stime=time.strftime(ISOTIMEFORMAT, localtime())
s='%s发送给我的信息是:%s' %(addr[0],data.decode('utf8'))
tcpClientSock.send(s.encode('utf8'))
print([stime], ':', data.decode('utf8'))
#如果输入quit(忽略大小写),则程序退出
STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
if STOP_CHAT:
break
tcpClientSock.close()
sock.close()改进版TCP客户端
客户端在发送数据前检查是否包含“quit”命令,若包含则终止循环并关闭连接。代码如下:
#-*- coding: utf-8 -*-
from socket import *
class TcpClient:
#测试,连接本机
HOST='127.0.0.1'
#设置侦听端口
PORT=1122
BUFSIZ=1024
ADDR=(HOST, PORT)
def __init__(self):
self.client=socket(AF_INET, SOCK_STREAM)
self.client.connect(self.ADDR)
while True:
data=input('>')
if not data:
break
#python3传递的是bytes,所以要编码
self.client.send(data.encode('utf8'))
print('发送信息到%s:%s' %(self.HOST,data))
if data.upper()=="QUIT":
break
data=self.client.recv(self.BUFSIZ)
if not data:
break
print('从%s收到信息:%s' %(self.HOST,data.decode('utf8')))
if __name__ == '__main__':
client=TcpClient()以上就是Python Socket网络编程的详细内容,更多关于Python Socket网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









