不知道你说的 stream 是指什么?二进制流的话用到的地方也挺多的吧,文件传输基本上都是用的二进制传输的吧,另外我记得微信开放接口的传输也是使用的二进制的。这个问题我不是很清楚,就稍带讲一下不多表了。

HTTP 长连接是什么?

我觉得你肯定理解错长连接是什么东西了。说到长连接我们必须说一下短连接。HTTP连接 是一种无状态连接,client 和 server 在三次握手建立连接之后,client 请求数据,server 返回数据后就会关闭连接,这种就是短连接。基于短连接的原理,我们在 client 使用 AJAX 不停的向服务器请求是否有新数据(即 AJAX pull)的行为就是轮询。这种方法优点在于简单,缺点当然也很明显,造成了相当多不必要的资源浪费以及服务器的无上压力。

为了解决这些问题,出现了基于短连接方法的修改版 - 长连接。长连接的方法也很简单,client 和 server 在三次握手建立连接,client 请求数据,当 server 端发现没有新数据的时候并不立即返回,而是hold住连接(即 Keep Alive),带有新数据返回 / 连接超时的时候则返回数据关闭连接。基于长连接的原理,当 client 收到数据返回(即连接断开)之后我们立即发起一次新的连接重复以上过程的方法就是我们所说的 长轮询 了。长连接比短连接的好处在于大大减少了 client 和 server 的请求次数。众所周知,一次 HTTP连接 需要经历三次握手这种复杂的过程,光速从美国经过海底光纤到达中国还需要 50ms 左右的时间呢,何况还要经历三次!所以这种方法的好处是很明显的,但是有好的一面也会有坏的一面。长连接由于需要服务器 hold 住连接,当 client 请求多的时候必然会对服务器造成 ++无上 的压力,这个压力并没有解决。

根据问题我再说一下 server 端 hold 住连接这个事情。众所周知,PHP当页面脚本执行完毕之后就会将内容返回给 CGI 然后交给 web server 返回给 client 端。所以 hold住连接这件事情也就非常简单,写一个死循环让脚本一直在运行即可 hold住连接了。PHP 对于这个的实现还是比较简单的,我在这里写一个语义 demo 仅供参考:

set_time_limit(0);

do {

$data = getNewData();

if( count($data) > 0 ) {

echo json_encode($data);

break;

}

sleep(5);

} while(true);

?>

使用长连接的时候记得 client 端发起请求的时候最好设置一个连接超时时间,当超过时间之后即断开链接,通过缩短超时时间可以达到控制服务器压力的目的,当超时时间过小的时候基本上就和轮询没有区别了。

SOCKET 是什么鬼及最美丽的语言能做任何事!

长连接和 socket 是没有什么关系的,现在我们来说说 socket。 socket 在 OSI网络七层协议中是介于应用层和传输层之间的东西,可以做基于 TCP, UDP, RawIP 和链路层的 socket(转自 网络篇详解)。具体的关于 HTTP链接 和 socket 的区别的话可以看看我刚才的引文,里面有较为详细的描述。不过简单来说就是 sockets 能模拟以 TCP/UDP 等为基础做的应用层的链接。

OSI中的层

功能

TCP/IP协议族

应用层

文件传输,电子邮件,文件服务,虚拟终端

TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet

表示层

数据格式化,代码转换,数据加密

没有协议

会话层

解除或建立与别的接点的联系

没有协议

传输层

提供端对端的接口

TCP,UDP

网络层

为数据包选择路由

IP,ICMP,RIP,OSPF,BGP,IGMP

数据链路层

传输有地址的帧以及错误检测功能

SLIP,CSLIP,PPP,ARP,RARP,MTU

物理层

以二进制数据形式在物理媒体上传输数据

ISO2110,IEEE802。IEEE802.2

那么 PHP到底可不可以做 socket 呢?答案是 可以的!毕竟是 世界上最美丽的语言 嘛!基于图灵完备的理论也的确是这样子的。在 PHP 中有专门的 socket 实现扩展:Sockets。但是大家说 PHP不可以 也不是错的。因为 PHP 的 socket 实现中由一个重要的步骤是使用 socket_listen() 函数实现端口的监听,这个就必须需要 CLI 的支持了。总所周知 PHP一般的应用是使用 CGI 在网页端实现,所以基于 CGI 上 PHP 的确是不可以的。但是 PHP 又不是没有 CLI,哼哼~

php sockets有什么用,PHP中Sockets与流有什么关系啊!!!!!相关推荐

  1. java 流的概念_举例讲解Java中的Stream流概念

    1.基本的输入流和输出流 流是 Java 中最重要的基本概念之一.文件读写.网络收发.进程通信,几乎所有需要输入输出的地方,都要用到流. 流是做什么用的呢?就是做输入输出用的.为什么输入输出要用&qu ...

  2. Python中怎样改变集合之间的关系?

    Python中怎样改变集合之间的关系?数学中,两个集合关系的常见操作包括:交集.并集.差集.补集.设A,B是两个集合,集合关系的操作介绍如下: 交集是指属于集合A且属于集合B的元素所组成的集合, 并集 ...

  3. 计算机游戏的产生,孩子容易沉迷计算机游戏,原来是因为过程中产生“心流”经验?...

    原标题:孩子容易沉迷计算机游戏,原来是因为过程中产生"心流"经验? 孩子容易沉迷计算机游戏,是因为过程中产生心流经验,从而获得满足感.在学习情境中,若也能提供促发心流经验的条件,自 ...

  4. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  5. 一文理清Mybatis中resultType与resultMap之间的关系和使用场景

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 1.概述 Mybatis ORM半自动映射框架对java开发工程师来说应该是必会的框架之一. ...

  6. java输出流输入流的使用_Java中的IO流之文件输入输出流

    Java中的IO流之文件输入输出流 1.文件流介绍 文件流是以字节为单位进行读写文件的,所以属于字节流,并且是低级流.文件流位于java.io包下. 输入输出流分别是FileInputSteam和Fi ...

  7. html5中的dom中的各种节点的层次关系是怎样的

    html5中的dom中的各种节点的层次关系是怎样的 一.总结 一句话总结:Node节点是所有节点的基类,所以都继承它的方法 1.dom提供在js中动态修改html标签的作用 比如增加修改标签等,并且是 ...

  8. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  9. UA OPTI512R 傅立叶光学导论25 透镜成像中光源与像的光强关系

    UA OPTI512R 傅立叶光学导论25 透镜成像中光源与像的光强关系 光强关系 光学传递函数 前两讲介绍了用物理光学的思路分析了透镜系统中输入波形与输出波形之间的关系,这一讲讨论输入波形的光强与输 ...

  10. C++ 中的 IO流

    目录 回顾:C语言中的输入输出 C++中的IO流 一.流是什么? 二.C语言中的IO流 三.C++中的IO流 四.C++中的文件流 回顾:C语言中的输入输出 理解C++中的IO流之前,先来回顾一下C语 ...

最新文章

  1. python等差分解一个数
  2. java web 来源页_JavaWeb 分页实现
  3. BZOJ 2434 Luogu P2414 [NOI2011]阿狸的打字机 (AC自动机、树状数组)
  4. 网易MCTalk聚焦前沿技术 助力传统企业数字化转型
  5. ES6-let和const命令
  6. 06Struts2国际化实现
  7. 大数据应用之金融行业-互联网金融对传统银行业的冲击,狼真的来了
  8. VCL已死,RAD已死(插播)
  9. 连续arq协议的利用率_Chrome底层原理和HTTP协议 - 石吴玉
  10. Android API 级别
  11. Matlab2012b安装步骤(附带Matlab2012b破解码及序列号)
  12. vue.js下载安装教程
  13. HTML5基于flash实现播放RTMP协议视频
  14. iphone越狱-------平刷回越狱前(未越狱)状态
  15. JAVEWEB 过滤器Filter的实现
  16. Java电阻计算器(二)
  17. layer弹出层不居中
  18. 理财就是理生活 —— 小白理财训练营(下)
  19. Mysql 时间格式化 DATE_FORMAT使用
  20. Platt SMO算法

热门文章

  1. ERROR: Could not create or update '/usr/local/nagios/var/nagios.configtest'
  2. python - 日期处理模块
  3. OpenCV 3.0 CvMat and cv::Mat Conversion
  4. OGNL(Object-Graph Navigation Language对象图定位语言)和struts2标签
  5. Jquery查找界面Html元素的方法(持续更新)
  6. 【德】博多·费舍尔 - 小狗钱钱2(2013年7月27日)
  7. 什么是SOHO一族?
  8. 不会点SQLite,都不好意思说自己是开发的 1
  9. bitnami下mysql配置-包含phpMyAdmin配置
  10. 数论19——高斯消元