现在的位置: 主页 > 新闻中心 > 文章列表

使用websocket发送图片文件

作者:沈阳市沈河区金瑞龙美术社 来源:www.jrlgg.com 发布时间:2017-09-06 11:00:16
 

使用websocket发送图片文件

Websocket是HTML5中的一个数据传输控件。

目前在主流的浏览器中都提供了支持。

关于websocket的相关协议可以在网上查到,关于如何建立连接等操作大家可以查询协议获得,本文主要讨论如何进行数据传输。

在客户端使用的是Chrome浏览器,在服务器端使用PHP开发websocket协议。

Websocket协议一个frame的标准格式:

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-------+-+-------------+-------------------------------+

|F|R|R|R| opcode|M| Payload len | Extended payload length |

|I|S|S|S| (4) |A| (7) | (16/64) |

|N|V|V|V| |S| | (if payload len==126/127) |

| |1|2|3| |K| | |

+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +

| Extended payload lengthcontinued, if payload len == 127 |

+ - - - - - - - - - - - - - - - +-------------------------------+

| |Masking-key, if MASK set to 1 |

+-------------------------------+-------------------------------+

| Masking-key (continued) | Payload Data |

+-------------------------------- - - - - - - - - - - - - - - - +

: Payload Datacontinued ... :

+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

| Payload Datacontinued ... |

+---------------------------------------------------------------+

图中的Payload Len表示发送数据长度。

当数据长度小于126时(0-125),长度使用7位表示。

当Payload len等于126时,需要使用扩展长度(Extendedpayload length),此时用16位表示长度(0-65535)。

当Payload len等于127时,采集软件,扩展长度的位数是64位(数据最大长度为2的64次方)。

所以理论上来讲,该协议能满足一次传输大数据的要求(相信也很少有一次性传输2的64次方数据的需求吧)。

实际使用中,会对发送数据的长度有一定限制。

比如出于安全考虑一次发送的MTU长度不大于1500个字节。

而chrome中对websocket的控件一次发送数据的长度限定在128Kbytes,也就是2的17次方的长度。并且这个最大长度貌似是不能通过配置修改的。

Php开发的服务器端,对发送数据的长度也有定义,通常是4096字节,这个大小是可以通过配置文件调整的,但出于整体性能的考虑一般采用默认设置。

通过以上情况可以看出,对于发送图片数据来说(一张图片往往会大于128KB)我们需要将图片数据进行切分。

应用层的协议需要对切分的图片数据进行控制。同时对于发送的图片数据进行一些转码的处理。

用户自定义数据传输协议位于数据的头部,占16个字节。

每一部分以字符串的格式表示2个字节的short类型,比如0x0016,则字符串表示为’0016’

用户自定义协议头:

数据编号

Short类型(4个字节)

保留

Char类型(4个字节)

数据总包数

Short类型(4个字节)

当前数据包索引

Short类型(4个字节)

数据编号:

标记一个大数据,防止在传输过程中产生错乱。一个大数据只有一个编号,从1开始,功能同时产生65535个大数据。

数据总包数:

表示一个大数据一共拆分成的数据包个数,最少1包,最多65535包。每一包数据的大小可以自定义,但不应超过128Kbytes大小。

当前数据包索引:

表示当前传输的是第几包数据。索引号从1开始,到65534结束。

接收和发送大数据的时候都需要对拆分的数据包进行处理。

发送时进行拆分处理。

接收时进行合并处理。

客户端的websocket数据收发基于chrome内核,使用JavaScript语言进行支持。

服务器端的websocket数据收发使用PHP语言进行支持。

客户端发送时需要对数据进行加密,使用Mask-Key,加密工作由websocket控件自动完成。

服务器端接收数据时需要对客户发发送的加密数据进行解密。

服务器端发送时暂时不对数据进行加密,后期可以考虑加上Mask-Key。

具体的Mask-Key和加解密的规则可以参考websocket协议。

选择图片发送

上图为选择一张图片发送到服务器端,再从服务器端返回到指定客户对显示。

图片的分辨率在320*240,图像大小在75Kbytes左右。

在发送时将数据拆分成2Kbytes大小的数据包,一共75K/2K*2=75包数据。

(编码时将一个字节拆成了两个字节编码)

每包发送数据的间隔定在500毫秒。(数据包的发送间隔的定义主要还是根据服务器端的处理能力制定,处理能力强可以更快的处理发送的数据包。或者可以使用应答方式进行传输,即每收到一包数据就通知发送端发送下一包数据。)

则我们可以计算出一幅75K左右的图片从A端传送到B端需要的时间是(相比较500毫秒的传送间隔,传送的数据可以忽略不计):

T=75*500ms=37.5s

也就是一幅320*240的图片传送时间在37.5s左右。

以上是以传输图片为例。进一步可以传输图像数据。还是以320*240图像为例,设每秒传输24幅图像,则传输一帧视频的流量为75KBytes*24=1.8Mbytes/s。

显然目前的传输速度对于传输视频是不够的。还需要在服务器端进行优化。

使用步骤:

1,打开数据发送连接和数据接收连接

2,以用户名登录,注册地址如下:

http://www.yourtechnic.com:7080/login.php

3,正常登录连接之后,选择需要发送的图片,点击“SendPicData”按钮

4,等待数据传输完成,接收端显示图片。

下一步尝试将图片传输的功能添加到YourAPP中,同时测试一下视频传输的可能性。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站建设 http://wuhan.45qun.com

  • 上一篇:JS高级做的导航条。可展开可挂起。可简化。
  • 下一篇:最后一页
  •