董付国Python视频大讲堂
您想知道的人工智能干货,第一时间送达
视频内容选自如上图书:
视频案例内容:
一般来说,客户端连接服务端之后每次通信只发送少量数据,完成会话之后立刻断开连接释放资源,需要时再次发起连接请求,这样可以减轻服务端压力。但建立连接和释放连接本身也是需要时间的,如果频繁创建连接和释放连接反而会浪费服务器资源,所以有些场合中需要长时间保持连接。默认情况下,如果对方长时间没有收发数据,TCP连接会自动断开,以免服务端长期存在半开放连接浪费资源。如果需要保持长时间,需要显式设置套接字为长连接模式。编写程序,使用TCP协议进行通信,并且使得TCP连接能够长时间保持存活。
示例代码如下:
1)服务端代码
import socket
from struct import unpack
sockServer =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sockServer.bind(('', 6666))
sockServer.listen(1)
conn, addr = sockServer.accept()
# 为客户端套接字开启长连接
# 保活设置只需要在一端启用就可以,不需要在服务端和客户端都设置
# 可以注释掉下面两行代码再运行,对比运行结果,理解保活机制的作用
conn.setsockopt(socket.SOL_SOCKET,socket.SO_KEEPALIVE, True)
conn.ioctl(socket.SIO_KEEPALIVE_VALS,
(1, # 开启保活机制
60*1000, # 60秒钟后如果对方还没有反应,开始探测连接是否存在
30*1000) # 30秒钟探测一次,默认探测10次,失败则断开
)
while True:
# 这里没有考虑高并发网络服务器,假设一次可以接收完数据
# 接收4个字节,解包为整数,表示对方要发送的字节串长度
data_length = conn.recv(4)
if not data_length:
conn.close()
break
data_length = unpack('i', data_length)[0]
data = conn.recv(data_length).decode()
print(data)
2)客户端代码
import socket
from time import sleep
from struct import pack
from datetime import datetime
sockClient =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 实际运行时建议使用两台计算机进行测试
# 一台计算机运行服务端,一台计算机运行客户端
sockClient.connect(('127.0.0.1', 6666))
except:
print('服务器不存在。')
exit()
for i in range(5):
msg = str(datetime.now())[:19]
print(msg)
msg = msg.encode()
sockClient.sendall(pack('i', len(msg)))
sockClient.sendall(msg)
# 每隔6分钟发送一次数据
sleep(360)
sockClient.close()
图3-6 开启保活机制时的运行过程
图3-7 没有开启保活机制时的运行过程
董付国,山东省一流本科课程“Python应用开发”负责人,山东省高等教育优秀教材《Python程序设计基础(第2版)》作者,清华大学出版社3本畅销教材作者,华为技术有限公司独立顾问,阿里云天池等多个平台合作伙伴,全国高等院校计算机基础教育研究会“教育信息化”专业委员会委员,机械工业出版社计算机分社成立20周年本科教材“金牌作者”。出版的Python系列教材被国内超过800所高校选用,国家图书馆和各省市图书馆以及学校图书馆馆藏,累计印刷超过120次。
往期精彩必读文章(单击就可查看):
1.
2.
3.
4.
5.
6.
7.
8.渊
9.
10.
11.
12.