tcp长连接和短连接

TCP在真正的读写操作之前,server与client之间必须建立一个连接,

当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

连接的建立通过三次握手,释放则需要四次握手,

所以说每个连接的建立都是需要资源消耗和时间消耗的。

TCP通信的整个过程,如下图:

1. TCP短连接

模拟一种TCP短连接的情况:

  1. client 向 server 发起连接请求
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,此时双方任何一个都可以发起 close 操作

在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。

从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

2. TCP长连接

再模拟一种长连接的情况:

  1. client 向 server 发起连接
  2. server 接到请求,双方建立连接
  3. client 向 server 发送消息
  4. server 回应 client
  5. 一次读写完成,连接不关闭
  6. 后续读写操作...
  7. 长时间操作之后client发起关闭请求

3. TCP长/短连接操作过程

3.1 短连接的操作步骤是:

建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

http 1.1是长连接

3.2 长连接的操作步骤是:

建立连接——数据传输...(保持连接)...数据传输——关闭连接

http 1.0是长连接

4. TCP长/短连接的优点和缺点

  • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

    对于频繁请求资源的客户来说,较适用长连接。

  • client与server之间的连接如果一直不关闭的话,会存在一个问题,

    随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

    如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

    如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

    这样可以完全避免某个蛋疼的客户端连累后端服务。

  • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
  • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

5. TCP长/短连接的应用场景

  • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

    每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

    再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

    再次处理时直接发送数据包就OK了,不用建立TCP连接。

    例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

    而且频繁的socket 创建也是对资源的浪费。

  • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

    而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

    如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

    那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

长连接,在一次连接的基础上把数据处理完后4次挥手

import socket
import redef service_client(new_socket, request):"""为这个客户端返回数据"""# 1. 接收浏览器发送过来的请求 ,即http请求  # GET / HTTP/1.1# .....# request = new_socket.recv(1024).decode("utf-8")# print(">>>"*50)# print(request)request_lines = request.splitlines()print("")print(">"*20)print(request_lines)# GET /index.html HTTP/1.1# get post put delfile_name = ""ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])if ret:file_name = ret.group(1)# print("*"*50, file_name)if file_name == "/":file_name = "/index.html"# 2. 返回http格式的数据,给浏览器try:f = open("./html" + file_name, "rb")except:response = "HTTP/1.1 404 NOT FOUND\r\n"response += "\r\n"response += "------file not found-----"new_socket.send(response.encode("utf-8"))else:html_content = f.read()f.close()response_body = html_contentresponse_header = "HTTP/1.1 200 OK\r\n"response_header += "Content-Length:%d\r\n" % len(response_body)response_header += "\r\n"response = response_header.encode("utf-8") + response_bodynew_socket.send(response)def main():"""用来完成整体的控制"""# 1. 创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 2. 绑定tcp_server_socket.bind(("", 7890))# 3. 变为监听套接字tcp_server_socket.listen(128)tcp_server_socket.setblocking(False)  # 将套接字变为非堵塞client_socket_list = list()while True:# 4. 等待新客户端的链接try:new_socket, client_addr = tcp_server_socket.accept()except Exception as ret:passelse:new_socket.setblocking(False)client_socket_list.append(new_socket)for client_socket in client_socket_list:try:recv_data = client_socket.recv(1024).decode("utf-8")except Exception as ret:passelse:if recv_data:service_client(client_socket, recv_data)else:client_socket.close()client_socket_list.remove(client_socket)# 关闭监听套接字tcp_server_socket.close()if __name__ == "__main__":main()

有了bodylenth的长度就不用写关闭socket,用长连接按接受的长度接受后就可以自动关闭了。

传智播客 tcp长连接和短连接 学习笔记相关推荐

  1. 传智播客-刘意-java深入浅出精华版学习笔记Day05

    [视频的前半段讲的是方法.因为方法和函数几乎是一样的,所以直接跳过去了,从数组开始看,唯一有一点需要注意的,就是现在我们暂时都把方法定义为public static型的] 定义格式: 数组的初始化: ...

  2. 传智播客-刘意-java深入浅出精华版学习笔记Day08

    工具中使用静态: 在同一个类中,main方法只能访问静态方法. [错误:无法从静态上下文中引用非静态,这样的错误一定是因为在main方法中调用了非静态方法.] 对非静态方法来说,只能通过对象(也就是其 ...

  3. 2010春节后传智播客报班JAVA,想找学习的人一起团报QQ940834693

    折腾这么久,熬了几个通宵,比较北京的几个有名的java培训机构,看他们的招生简章,听他们的网络课程,最终选择了传智播客.现在听说传智播客团报便宜.所以寻找过了春节想去传智播客学java的同道.qq:9 ...

  4. 传智播客 .NET面试宝典(2015版)

    .Net工程师面试笔试宝典 培训班常见问题 1.你们会带着我们做完整个完整的项目吗? 答:小的项目会,大的项目则不可能, 1.众所周知,随便拿出一个中等大小的项目,也需要好多个熟练的开发人员开发好多个 ...

  5. 传智播客 - java 就业面试题大全

      从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做:第二,你非常痴迷 ...

  6. 传智播客100万现金奖励优秀校友

    传智播客培训出来的很多同学就业起薪达到了7k8k左右,其中不乏未毕业的大学生和年龄不满20岁的高中生,曾经有一点社会工作经历的人从传智播客一毕业就拿到9k甚至1万以上的人也不少见.传智播客的老师们遥想 ...

  7. 传智播客JDBC视频教程

    视频介绍: 一些视频教程通过浅显案例来让初学者感到轻松,但是课程中编写的代码不能直接应用于项目中:而本套视频教程正好相反,视频讲解者李勇老师以技术见长,性格朴实无华.不善于幽默搞笑,李勇老师编写的代码 ...

  8. 传智播客Java面试宝典 | 张老师尽心整理的面试宝典大全,面试阿里腾讯不成问题。西边人西说测试

    提示:本大全每半月更新一次,请持续保持关注!谢谢! 索取方式:头条或公众号中回复[面试] 从享受生活的角度上来说:"程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员, ...

  9. 感谢传智播客+C#.Net学习之旅

    <C#.Net基础学习视频2014版>在本月中旬左右终于学习完了,终于学完了.                 自2015年暑期7月份开始学习C#.Net基础学习视频以来,直到本月才学习完 ...

  10. 传智播客.黑马程序员,学C++不再难!

            众所周知,C++难.就好像博大精深的汉语比英语难,这是客观事实,我们并不否认.        但,转念想想,英语也不简单吧?从小学开始学,到了大学,挂在四六级上的同学数不胜数.可貌似没 ...

最新文章

  1. 中兴同美司法部和解协议获准:罚12亿美元
  2. 11深入理解C指针之---指针和常量
  3. 在Vista下配置VS2003
  4. [心得分享] 产品规划思考
  5. vue 自己写组件。
  6. Go语言中查询SqlServer数据库
  7. 【操作系统复习】操作系统的特征
  8. 解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题
  9. CS188-Project 4
  10. scratch编程一款节奏小游戏
  11. Django中.py文件详解
  12. 淘宝触屏版宝贝详情改造(一)
  13. [数学学习笔记]极限的概念.
  14. 利用局域网将电脑上的文件快速下载到手机上
  15. 笔记本的麦克风录不了音说不了话
  16. web快速入门之基础篇-js:3_3、简易购物车
  17. Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问
  18. 【Unity3D】Unity3D 软件安装 ( 注册账号并下载 Unity Hub | 安装 Unity Hub | 获取个人版授权 | 中文环境设置 | 安装 Unity3D 编辑器 )
  19. Quora精选:为什么软件开发周期总是预估的2~3倍?
  20. 【MySQL】这是我见过最有用的MySQL数据类型面试题,面了无数家总结的

热门文章

  1. 管理感悟:人事问题不能拖,必须立即处理
  2. 小米6twrp最新第三方rec_小米5(gemini:双子座)刷机
  3. shield tv android tv,NVIDIA老机顶盒SHIELD TV升级安卓7.0:国行眼巴巴
  4. java trrows处理_检查表并根据同一表中两个匹配列的值使tr内容加粗
  5. 中的draw函数_哪一个热图函数更快?
  6. java B2B2C 源码 多级分销Springcloud多租户电子商城系统-Spring Cloud eureka
  7. Mysql基础之 ALTER命令
  8. centos7.3 安装ansible
  9. 《高性能Linux服务器构建实战》——2.2节开始安装Varnish
  10. js 原始数据类型、引用数据类型