点击上方“图灵人工智能”,选择“星标”公众号
您想知道的人工智能干货,第一时间送达
视频内容选自如上图书:
视频案例内容:
一般来说,客户端连接服务端之后每次通信只发送少量数据,完成会话之后立刻断开连接释放资源,需要时再次发起连接请求,这样可以减轻服务端压力。但建立连接和释放连接本身也是需要时间的,如果频繁创建连接和释放连接反而会浪费服务器资源,所以有些场合中需要长时间保持连接。默认情况下,如果对方长时间没有收发数据,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:
# 实际运行时建议使用两台计算机进行测试
# 一台计算机运行服务端,一台计算机运行客户端
# 并把下面代码中的'127.0.0.1'修改为服务端计算机的IP地址
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()
使用联网的两台计算机测试程序,一台计算机运行服务端程序,一台运行客户端程序,并把客户端程序中的本地回环地址'127.0.0.1'修改为服务端程序所在计算机的真实IP地址,运行结果如图3-6所示,删除或注释掉服务端开启保活机制的两行代码之后再运行,结果如图3-7所示。可以看出,如果没有开启保活机制,无法保持TCP长连接。如果客户端长时间不操作,再次发送数据时会因为连接已断开而失败。
图3-6 开启保活机制时的运行过程
图3-7 没有开启保活机制时的运行过程
董付国,山东省一流本科课程“Python应用开发”负责人,山东省高等教育优秀教材《Python程序设计基础(第2版)》作者,清华大学出版社3本畅销教材作者,华为技术有限公司独立顾问,阿里云天池等多个平台合作伙伴,全国高等院校计算机基础教育研究会“教育信息化”专业委员会委员,机械工业出版社计算机分社成立20周年本科教材“金牌作者”。出版的Python系列教材被国内超过800所高校选用,国家图书馆和各省市图书馆以及学校图书馆馆藏,累计印刷超过120次。
往期精彩必读文章(单击就可查看):
1.
谷歌突然宣布:上帝的密码防线逐渐崩溃!人工智能有可能是人类文明史的终结!
2.人工智能的现状与未来
3. 国防科技大学教授:殷建平——计算机科学理论的过去、现在与未来
4.图灵奖得主Hamming的22年前经典演讲:如何做研究,才能不被历史遗忘
5.当这位70岁的Hinton老人还在努力推翻自己积累了30年的学术成果时,我才知道什么叫做生命力(附Capsule最全解析)
6.科学正在证明,科学并不科学
7.沉痛!中国半导体 ”芯酸“史!
8.数学的深渊
9. 计算的极限(续)
10.计算的极限
11.高考大数据:哪个省才是高考地狱模式?结论和想象不太一样
12.老婆离家三周,我写了一个操作系统!