社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

董付国Python视频大讲堂

图灵人工智能 • 2 年前 • 226 次点击  

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

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

                         

视频内容选自如上图书:

视频案例内容:

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