编程

Websocket详细讲解(基础篇一)

因为websocket的内容比较多,所以准备分解将基础篇主要讨论一下websocket的概念,websocket和http协议的区别,客户端的websocket以及服务端的websocket,中间穿插着一些实例,最后以一个基本的实例还结束基础篇。扩展篇讨论一下nodejs中socket及其应用。下面我们就来进入正式话题…

基于内容推荐的个性化新闻阅读实现

这一直是本人想做的一个项目,缘由是现在的信息越来越多,越来越廉价,所以我必须想办法能自动挑出我感兴趣的文章,而不是一打开订阅邮箱堆积着好多好多的订阅文章,想要消化这些文章又不知哪里下手。其实以前好像看到说,Twitter已经着手研究这类问题,今后可能Twitter信息将按照用户的喜好程度,而不是时间排序展列了,国内低效著称的某浪不知道有没有着手这方面的研究,还是坐等着山寨呢?
同时,国内的今日头条算是当前最大的移动端信息聚合平台了,之前使用见他每个文章都有好几个TAG,所以不知道他的推荐算法是不是简单基于标签计算的。之前的推荐算法介绍…

再见,CSRF:讲解set-cookie中的SameSite属性

SameSite-cookies是一种机制,用于定义cookie如何跨域发送。这是谷歌开发的一种安全机制,并且现在在最新版本(Chrome Dev 51.0.2704.4)中已经开始实行了。SameSite-cookies的目的是尝试阻止CSRF(Cross-site request forgery 跨站请求伪造)以及XSSI(Cross Site Script Inclusion (XSSI) 跨站脚本包含)攻击。详细介绍可以看这一篇文章(https://tools.ietf.org/html/draft-west-first-party-cookies-06)。…

Websocket原理及使用场景

WebSocket的使用场景

社交聊天、弹幕、多玩家游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等需要高实时的场景

由轮询到WebSocket

1 轮询

客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。客户端会轮询,有没有新消息。这种方式连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。

2 长轮询

长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,有没有新消息,如果没有新消息,就一直等待。当有新消息的时候,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。但是这种方式还是有一种弊端:例如假设服务器端的数据更新速度很快,服务器在传送一个数据包给客户端后必须等待客户端的下一个Get请求到来,才能传递第二个更新的数据包给客户端,那么这样的话,客户端显示实时数据最快的时间为2×RTT(往返时间),而且如果在网络拥塞的情况下,这个时间用户是不能接受的,比如在股市的的报价上。另外,由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。

3  WebSocket

现在急需的需求是能支持客户端和服务器端的双向通信,而且协议的头部又没有HTTP的Header那么大,于是,Websocket就诞生了!流量消耗方面,相同的每秒客户端轮询的次数,当次数高达数万每秒的高频率次数的时候,WebSocket消耗流量仅为轮询的几百分之一

WebSocket协议原理

Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:

1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。

2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。…

Libevent内部实现原理初探

Libevent确实方便了开发人员,对于定时器、信号处理、关心的文件或者套接字,只需要挂载到event_base上面,设置好对应的回调函数和参数就可以了,当对应的事件发生时,Libevent会自动调度相应的回调函数进行处理。
本文就按照之前在sshinner(https://github.com/taozhijiang/sshinner)中使用Libevent的过程,以这些接口函数作为突破点,沿着代码走了一朝,尝试探究一下Libevent的内部工作流程是怎样的。由于本人能力有限,有些东西可能不够详尽或者准确,还望不吝指出。…

四种框架分别实现百万websocket常连接的服务器

事实上,最近我又增加了几个框架,现在包括 Netty, Undertow, Jetty, Spray, Vert.x, Grizzly 和 Node.js七种框架。
测试数据可以看下一篇文章: 七种WebSocket框架的性能比较

著名的 C10K 问题提出的时候, 正是 2001 年。这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的限制,单机1万还是一个非常值得挑战的目标。但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情。…

软件开发需要编写哪些文档

如今,软件开发越来越复杂,软件的功能也越来越丰富。而几乎所有成熟的商业软件,都是一个开发团队齐心协力的血汗结晶。”罗马不是一天建成的。”,当我们震撼于Microsoft Windows的惊世巨著的同时,也道听途说了一些微软公司软件工程是如何的完善和规范。软件项目管理的成败是控制开发成本的关键环节。这里面,少不了贯穿其中的重要步骤软件文档。 …

Composer 终于走到了 v1.0 版本

Composer 项目刚刚宣布在其第五个生日的同一天发布了 V1.0 正式版

以下翻译自 Composer 创始人 Jordi Boggiano 的原文:

五年前的今天,Composer 诞生了。在某些方面,这感觉就像昨天发生的事,至少它不像过去了五年。但在其他方面,好像是上辈子的事了,没有一个完整的 PHP 生态系统,我的手指几乎都不记得如何编写 PHP 代码了。

在这个版本中,Composer 安装工具以及执行 composer self-update 指令都会默认安装最新的 Composer 稳定版本。要知道,以前可都是 alpha 版本啊,五年了!整整五年 alpha 了!Jordi 这样解释道:“如果执行 composer self-update 是你部署流程中的一部分时,这能避免带来破坏,但它也意味着,当我们做任何修改时,反馈会比较曲折“。…

编程的智慧(下)

  • 下面我对这些情况举一些例子。

    情况1:下面这段代码里面有一个continue:

    List<String> goodNames = new ArrayList<>(); for (String name: names) { if (name.contains("bad")) { continue; } goodNames.add(name); ... } 

    它说:“如果name含有’bad’这个词,跳过后面的循环代码……” 注意,这是一种“负面”的描述,它不是在告诉你什么时候“做”一件事,而是在告诉你什么时候“不做”一件事。为了知道它到底在干什么,你必须搞清楚continue会导致哪些语句被跳过了,然后脑子里把逻辑反个向,你才能知道它到底想做什么。这就是为什么含有continue和break的循环不容易理解,它们依靠“控制流”来描述“不做什么”,“跳过什么”,结果到最后你也没搞清楚它到底“要做什么”。

Page 4 of 15« First...23456...10...Last »