Socket的长连接和短连接_woy66的博客-程序员秘密

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口
Socket接口定义了许多函数或例程
短连接
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束后就中断连接。短连接是指SOCKET连接后发送后接收完数据后马上断开连接。
长连接
连接->传输数据->保持连接->传输数据->….->关闭连接
长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。
http的长连接
HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持,但还是无状态的,或者说是不可以信任的。
长连接多用于操作频繁,点对点的通讯(及时通讯),而且连接数不能太多。每个TCP连接都需要三次握手,建立连接,会比较耗时。如果每个操作都要先连接,再操作的话,处理速度会降低很多。长连接的特点是每个操作完后都不断开连接,直接发送数据包就可以了,不需要每次都建立连接。
数据库的连接用长连接。如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。
像web网站的http服务一般都是用短连接,因为长连接对于服务器来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一点资源,如果用长连接,而且同时又成千上万的用户,如果每个用户都占用一个连接的话,并发量大,对服务器的压力比较大。如果每个用户无需频繁操作情况下需用短连接。
在长连接中一般无法判断读写什么时候结束,必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度读相应长度的报文。
Socket是应用层与TCP/IP协议族通信中间软件抽象层,它是一组接口
这里写图片描述
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议
UDP包括DNS、TFTP等协议
长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接;后者是每次请求,都新建一个Socket,处理完一个请求就直接关闭掉Socket。所以,其实区分长短连接就是:整个客户和服务端的通讯过程是利用一个Socket还是多个Socket进行的。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41173457/article/details/81351142

智能推荐

递归获取JSON内容的key-value值_积跬步以至千里的博客-程序员秘密

方法主体: /** * 递归获取每个JSONObject的最后一个节点的key与value * 如果遇到相等的key,则key为'key=>value'执行时保存 。或在后一个key值拼接随机种子 * 为以后处理JSON的主要工具类 * 开发日期:2014-7-10 16:41 * * @author mengfeiyang * @param o

linux c语言 printf,LinuxC下wprintf和printf混用_魏长卿的博客-程序员秘密

译文部分Linux C下printf 和wprintf混用,仅一个有效果,另一个写返回-1.无errno信息,但是写失败。问题解答链接https://stackoverflow.com/questions/26816547/whats-the-difference-between-printfs-printfls-wprintfs-and-wp标准解析链接https://en.cppreferen...

SpringBoot--SpringBoot项目结构介绍_我和井盖都笑了的博客-程序员秘密

Spring Boot 项目结构介绍    1 POM 文件      1.1 继承<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-start...

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (default-test) on_路途芬芳的博客-程序员秘密

今天在打包springboot项目的时候遇到该报错解决1:在pom加上<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-s...

单例模式(Singleton)_weixin_33716941的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

随便推点

构建docker镜像时fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz超时_yanwei2020的博客-程序员秘密

1、超时原因外部网站,国内访问时可能会超时fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz2、解决方法修改Dockerfile,使用国内的alpine源2.1、正确的做法正确的做法是使用国内源完全覆盖 /etc/apk/repositories在Dockerfile中增加下面的第二行FROM alpine:3.7RUN echo -e http://mirrors.ustc.edu.cn

第2章 Linux&Unix_会思考的浣熊的博客-程序员秘密

第2章 Linux&Unixbooting bootstrappingmonolithic kernelmicrokernel serveGUI graphical user interface非盈利版权 Copyleft GPL general public license 发行版 distribution (dist

【maven】将jar包添加进本地仓库中_dfile jar__修铁路的的博客-程序员秘密

开发时,偶尔会遇到需要的jar包,明明maven仓库中心有,但就是载不下来,需要我们从仓库中心,下载后,将jar包添加进本地的仓库中,供项目总的pom文件引用。 1. 从maven仓库中心或者是其他途径下载我们所需要的jar包 2. 在文本编辑器中,提前编辑好以下命令,根据jar包实际情况替换对应的变量mvn install:install-file "-Dfile=本地jar包所在路径" "-DgroupId=设置groupId" "-Darti...

java判断string字节数_Java中关于String类的基本操作(字符与字符串的相互转换、字节与字符串的相互转换、字符串比较、..._夜色冷浮华的博客-程序员秘密

文章目录1 字符与字符串的相互转换1.1 将字符数组转为字符串1.2 将字符串转为字符数组1.3 将字符串转为单个字符1.4 判断一个字符串是否由数字组成?2 字节与字符串的相互转换2.1 将字节数组转为字符串2.2 将字符串转为字节数组3 字符串比较3.1 不区分大小相等比较3.2 比较两个字符串的大小4 字符串查找4.1 判断字符串在源字符串中是否存在4.2 判断字符串是否以指定的字符串开始4...

使用qemu运行X86版本的QNX7.0系统_qemu qnx_玄道公子的博客-程序员秘密

原本想使用VMWare来运行X86版本的QNX7.0系统,但是运行起来之后,没法输入。 虽然QNX官方有提供现成的QNX VMware镜像,但那不是我需要的东西,所以参照官方的QNX VMware镜像,根据它的启动脚本, 我将标准的QNX X86 BSP包中编译和启动脚本x86_64-denverton.build文件进行了修改,针对VMware的特殊情况,使用了devh-ps2ser-vm.s...

iOS presentViewController 详解 ModalPresentationStyle_Leecsdn77的博客-程序员秘密

一、用途和相关概念iOS中显示ViewController的方式有两种push和modal,modal也叫模态,模态显示VC是iOS的重要特性之一,其主要用于有以下场景:- 收集用户输入信息- 临时呈现一些内容- 临时改变工作模式- 相应设备方向变化(用于针对不同方向分别是想两个ViewController的情况)- 显示一个新的view层级这些场景都会暂时中断APP的正常执...

推荐文章

热门文章

相关标签