Socket 与 WebSocket

2016-09-15 更新: 加入 PDF 版本网络协议图


去年光棍节的时候,我写过一篇 quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket 。这篇文章介绍了我为何决定在项目中使用 LuaSocket 。

现在想起来,当时对 WebSocket 是很感兴趣的,但由于服务端的限制,最终依然选择了 LuaSocket。我后来对 LuaSocket 进行了封装,使其更好用。

现在,面对一个全新的项目,我自然而然地选择了 WebSocket。

因此,我需要了解下面这些问题:

  1. Socket 和 WebSocket 有哪些区别和联系?
  2. WebSocket 和 HTML5 是什么关系?
  3. 必须在浏览器中才能使用 WebSocket 吗?
  4. WebSocket 能和 Socket 一样传输 raw 数据么?
  5. WebSocket 和 Socket 相比会多耗费流量么?

但是,目前网上全面介绍这两种协议的中文文章并不多,或者说不够全面。我无法找到一篇文章能解决上面的所有问题。因此,我写了本文,把找到的 Socket 和 WebSocket 的相关资料做一个梳理,以方便理解。

本文并不能直接完整回答上面提出的几个问题,但读完本文,要理解上面的那些问题,是很容易的事。

由于能力有限,本文不可能很长。而且,技术细节并非所有人都愿意仔细了解。本文包含了大量的外部链接,跟随这些链接,可以找到足够多的细节,满足你/我的求知欲。


1. 概述

选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较。最常见的,就是需要比较 WebSocket 与 HTTP、Socket 技术的异同。

WebSocket 是为了满足基于 Web 的日益增长的实时通信需求而产生的。在传统的 Web 中,要实现实时通信,通用的方式是采用 HTTP 协议不断发送请求。但这种方式即浪费带宽(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有信息也要接受请求)。(下图来自 WebSocket.org

Latency comparison between the polling and WebSocket applications

而是用 WebSocket 技术,则会大幅降低上面提到的消耗:(下图来自 websocket.org

Comparison of the unnecessary network throughput overhead between the polling and the WebSocket applications

关于更详细的描述,尹立的这篇文章讲得非常好:WebSocket(2)–为什么引入WebSocket协议

那么,WebSocket 到底与 HTTP 协议到底是一个什么样的关系呢?它和 Socket 又有什么联系?这就要讲到 OSI 模型和 TCP/IP 协议族。 继续阅读Socket 与 WebSocket

一个LuaSocket封装

一个LuaSocket封装

2014-01-10更新: SocketTCP 已经进入 quick-cocos2d-x 的 framework.


quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket 一文中,我提到了选择 LuaSocket 与服务器通信。

为了方便使用,我对LuaSocket进行了封装。封装主要做了这样几件事:

  1. 封装基于 LuaSocket 的 TCP 模式,使用 settimeout 实现异步调用;
  2. 利用 cocos2d-x 提供的定时器实现失败重连;
  3. 利用 quick-cocos2d-x 提供的 framework.api.EventProtocol 实现了事件的注册和发布。

这个封装完全依赖 quick-cocos2d-x ,因此不能单独在lua环境中使用。

这个封装修改自 quick 论坛的一个源码 ,感谢原作者!

下面的例子依赖 ByteArray,详情看这里:用lua实现ByteArray和ByteArrayVarint继续阅读一个LuaSocket封装

quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket

quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket

  • 2013-11-17更新:加入SocketTCP和ByteArray类的实现链接。
  • 2014-11-05更新:增加范例链接。
  • 2014-12-04更新:一篇更详细的文章: Socket 与 WebSocket

在 quick-cocos2d-x 中,默认集成了 LuaSocket 和 WebSocket 两个 Socket 库。那么,在开发需要长连接的手机游戏时,应该选择哪个库呢?下面从几个方面进行比较:

  1. 跨平台;
  2. 易用性;
  3. 性能;
  4. 流量;
  5. 灵活性;
  6. 二进制编码;
  7. 服务器实现。

继续阅读quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket

【转】HTTP POST GET 本质区别详解

【转】HTTP POST GET 本质区别详解

原文地址:http://blog.csdn.net/gideal_wang/article/details/4316691
原文作者:gideal_wang

感谢原文作者写出这篇通俗易懂的文章。转载过程中,对格式和部分用语做了修改。


一 原理区别

一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交。

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。

URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询 资源信息,而POST一般用于更新 资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 )。

根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的 。 继续阅读【转】HTTP POST GET 本质区别详解

【转】Java socket – 套接字基础

转自:http://caihx.javaeye.com/blog/605143

套接字基础

1. 介绍

多数程序员,不管他们是否使用 Java语言进行编码,都不想知道很多关于不同计算机上的应用程序彼此间如何通信的低级细节。程序员们希望处理更容易理解的更高级抽象。Java程序员希望能用他们熟悉的 Java 构造,通过直观接口与对象交互。

套接字在两个领域中都存在 ―我们宁愿避开的低级细节和我们更愿处理的抽象层。本教程讨论的低级细节将只限于理解抽象应用程序所必须的部分。 继续阅读【转】Java socket – 套接字基础

【转】Http和Socket连接区别

转自:http://blog.csdn.net/zsnlovewl/archive/2009/12/12/4991820.aspx

1、TCP连接

要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

建立起一个TCP连接需要经过“三次握手”:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 继续阅读【转】Http和Socket连接区别

在Flex2中使用NetConnection的一些注意事项

在使用ActionScript3的NetConnection类连接Flash Media Server或者Remoting的时候,需要注意以下几点:

1.注意设定AMF版本

ActionScript3默认使用的是AMF3,而ActionScript2和ActionScript1使用的是AMF0,如果不指定NetConnection的AMF版本,就会出现连接失败。指定的方法如下:

NetConnection.defaultObjectEncoding = flash.net.ObjectEncoding.AMF0;

上面的代码会修改所有的NetConnection实例的默认AMF版本。

如果只需要修改一个NetConnection实例的AMF版本,代码如下:

public var NC:flash.net.NetConnection;
NC = new NetConnection();
NC.objectEncoding = flash.net.ObjectEncoding.AMF0;

2.获取onStatus状态值

在ActionScript2中的方法已经不能使用,要获取NetConnection实例的连接状态,必须使用NetStatusEvent事件类,代码如下: 继续阅读在Flex2中使用NetConnection的一些注意事项

关闭聊天室窗口NetConnection不断开的问题及其解决

问题:

将一个视频聊天室系统从FCS升级到FMS,目前的客户端是Flash player 8,客人从浏览器登陆后,选择一个聊天室进入,此时会弹出一个新窗口,聊天室就在新窗口中。但是当关闭聊天室的时候,却并没有触发FMS程序中的onDisConnect事件,客人仍然可以听到聊天室中的声音,必须关闭所有的浏览器窗口,才会完全退出聊天室。

继续阅读关闭聊天室窗口NetConnection不断开的问题及其解决

【转】IP地址信息查询(WHOIS)服务的原理

原文地址

RFC812定义了一个非常简单的Internet信息查询协议——WHOIS协议。其基本内容是,先向服务器的TCP端口43建立一个连接,发送查询关键字并加上回车换行,然后接收服务器的查询结果。

世界上各级Internet管理机构秉承公开、公正、共享的原则,设立了可以查知IP地址和域名所有者登记资料的WHOIS服务器,以便所有Internet的使用者排除故障、打击网上非法活动。全世界国际区域性的IP地址管理机构有四个:ARINRIPEAPNICLACNIC,他们负责的IP地址的地理区域如下图所示。

继续阅读【转】IP地址信息查询(WHOIS)服务的原理