Python社区  »  Python

董付国Python视频大讲堂

图灵人工智能 • 3 月前 • 60 次点击  

点击上方“图灵人工智能”,选择“星标”公众号

您想知道的人工智能干货,第一时间送达

                         

视频内容选自如上图书:

视频案例内容:

 一般来说,客户端连接服务端之后每次通信只发送少量数据,完成会话之后立刻断开连接释放资源,需要时再次发起连接请求,这样可以减轻服务端压力。但建立连接和释放连接本身也是需要时间的,如果频繁创建连接和释放连接反而会浪费服务器资源,所以有些场合中需要长时间保持连接。默认情况下,如果对方长时间没有收发数据,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.老婆离家三周,我写了一个操作系统!


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118172
 
60 次点击  
分享到微博