最近在利用Html5的WebSocket进行即时通讯,一点小心得,大家一起讨论吧

首先把WebSocket的协议网址和WebSocket API网址给大家:

协议:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#page-30

API:http://www.w3.org/TR/2012/CR-websockets-20120920/#dom-websocket-send

首先要了解一下WebSocket的原理:

上图表示的是已经建立WS连接的WebSocket通信。如图可见单纯从服务器端来讲,WS的服务器端实际上就一个传统Socket通信,假如你要模拟即时通讯,那就把文本转换为二进制流;假如传输图像,就把Blob转换为二进制流;假如传输数值型数组就把数组转换为字节数组。本研究中是实现大规模地形数据的传输,地形网格其本质就一个n*n的矩形数组,根据博文http://www.cnblogs.com/fengyunlishi/archive/2013/05/09/3070142.html,可以晓得。显然把地形数据转换成文本字符串是极为不合理的(因为这不仅仅涉及到文本压缩,还要考虑客户端还要把文本数据再处理成数值数组哦)。

对于大规模数据的传输,有两种方案:

(1)将整型数组根据某个分隔符连接成字符串,之后将字符串转换为字节数组,但是要记住哦:分隔符的数量几乎与整型数组长度相等哦,最终数据量变成了原来的2倍大小。

(2)将整型数组直接转换为字节数组,一个Int16型的整数无论大小,转换为字节数组后,长度为一常量:2,易于编程实现。

意义太明显,哈哈,所以本文采用将数值型数组转换为字节数组。

代码如下:

UInt16[] int16Array = new UInt16[3] { 0, 258, 1 };

MemoryStream int16mem = new MemoryStream();

BinaryWriter int16byteWR = new BinaryWriter(int16mem);

foreach (Int16 hehe in int16Array)

{

int16byteWR.Write(hehe);

}

Byte[]   _content = int16mem.ToArray();………… 略

关键点一:你如何决定WS服务器端传输什么类型的数据呢?

通过WebSocket的数据帧结构图(网上有很多介绍WebSocket数据帧结构的博客),可以了解WebSocket的数据传输格式是在Opcode位中设计的:

Opcode:4bit,定义有效负载数据,如果收到了一个未知的操作码,连接也必须断掉,以下是定义的操作码:

x0表示连续消息片断

x1表示文本消息片断//表示传输文本型数据

x2表未二进制消息片断//表示传输Blob以及二进制数据

x3-7为将来非控制消息片断保留地操作码

x8表示连接关闭

x9表示心跳检查的ping

xA表示心跳检查的pong

xB-F为将来控制消息片断的保留地操作码

本文把Opcode设置为x2.

关键点二:

第二个关键在于WebSocket的js客户端接收,代码如下:

var ws;  ws = new WebSocket("ws://localhost:8989/test");

ws.onopen = WSonOpen; ws.onmessage = WSonMessage;

ws.onclose = WSonClose; ws.onerror = WSonError;……

function WSonOpen() {

ws.binaryType = 'arraybuffer';//可将 WebSocket 对象的 binaryType 属性设为“blob”或“arraybuffer”。默认格式为“blob”(您不必在发送时校正 binaryType 参数)。

};

function WSonMessage(event) {

var result = new Int16Array(event.data);

for (var i = 0; i < result.length; i++) {

alert(result [i]);

}

};

OK了,大功告成,程序中result就是传过来的数值型数组。

利用WebSocket传输数组或者Blob的方案的更多相关文章

  1. AJSX 传输数组

    如果要利用ajax传输数组,或者传输多个(不知道有多少个)class的某一属性的值,例如: 要将这三个数据传入php编辑界面,图片显示有三个数据,但实际上,数据的多少是由数据库所导出的数据 决定的.如 ...

  2. html5利用websocket完成的推送功能

    利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0,一些东西是自己琢磨的,也不知道恰不恰当,不恰当处,还请各位见谅,并指出. 程序简单来说,就是客户A可以发送消息给客户 ...

  3. 利用websocket实现微信二维码码扫码支付

    由于业务需要引入微信扫码支付,故利用websocket来实现消息推送技术. 实现大致流程:首先客户端点击微信支付按钮,触发微信支付接口,同时微信支付响应成功参数后,连接websocket客户端,此刻利 ...

  4. html5利用websocket完成的推送功能(tomcat)

    html5利用websocket完成的推送功能(tomcat) 利用websocket和java完成的消息推送功能,服务器用的是tomcat7.0.42,一些东西是自己琢磨的,也不知道恰不恰当,不恰当 ...

  5. websocket 传输数据帧打包 (client端)

    /* Vertion: 0.2.1 date: 2015.8.11 content: gcc 编译通过 */ //websocket 传输数据帧打包 client端 //参数:src 为输入字符串 / ...

  6. 利用HDFS实现ElasticSearch7.2容灾方案

    利用HDFS实现ElasticSearch7.2容灾方案 目录 利用HDFS实现ElasticSearch7.2容灾方案 前言 快照版本兼容 备份集群 HDFS文件系统 软件下载 JDK环境 配置系统 ...

  7. [转]利用ssh传输文件

    利用ssh传输文件 http://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html 在linux下一般用scp这个命令来通过ssh传输文 ...

  8. HDU - 1166 敌兵布阵 方法一:(线段树+单点修改,区间查询和) 方法二:利用树状数组

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  9. 利用ssh传输文件-服务器之间传输文件

    利用ssh传输文件   在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件scp username@servername:/path/filename /var/www/ ...

随机推荐

  1. excel 2016 for mac破解

    1: 首先去官网下载一个正版的: 2:再下载一个破解工具: 链接: http://pan.baidu.com/s/1i4AFHFf 密码: 3yf8 3:最后按照破解教程破解: http://jing ...

  2. 算法之DP

    一般DP 都是有模板的,先初始化,然后找到不同状态下数值的关系,使得某个状态可用另一个状态由一个固定的方式转移而来,列出状态转移方程,这就是DP: 例题 P1216 [USACO1.5]数字三角形 N ...

  3. SQL Server 3

    一.数据压缩 1.行压缩 行压缩可将固定长度类型存储为可变长度存储类型.例如,使用char(100)数据列存储字符串“SQL Server 2012”,压缩后只需要存放15个字符.(这种压缩模式,将对 ...

  4. 【LOJ】#2549. 「JSOI2018」战争

    题解 仔细分析了一下,如果写个凸包+每次暴力半平面交可以得到70分,正解有点懵啊 然后用到了一个非常结论,但是大概出题人觉得江苏神仙一个个都可以手证的结论吧.. Minkowski sum 两个凸包分 ...

  5. ES8之async/await学习随笔

    详细学习参考文档: 阮一峰老师的博客,覆盖知识点ES6/7/8/9,本篇学习笔记对阮老师的关于async/await文档中的知识点进行分点总结 在ES8中加入async/await新特性后,很明显带来 ...

  6. Python3 BP神经网络

    转自麦子学院 """ network.py ~~~~~~~~~~ A module to implement the stochastic gradient descen ...

  7. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  8. 在VC++中怎样改变控件间的TAB切换顺序?

    在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.

  9. 硬盘 不属于Rom RAM

    是外置存储器, 不是ROM也不算RAM,rom是固化系统基本程序,如电脑的bios,ram是电脑的内存,平常说几个G内存就是指的RAM

  10. BZOJ.4695.最假女选手(线段树 Segment tree Beats!)

    题目链接 区间取\(\max,\ \min\)并维护区间和是普通线段树无法处理的. 对于操作二,维护区间最小值\(mn\).最小值个数\(t\).严格次小值\(se\). 当\(mn\geq x\)时 ...