websocket客户端的代码

本文介绍了一种WebSocket客户端的实现方法,包括握手过程及消息发送的细节。通过对时间戳进行两次MD5加密生成密钥,并将其加入到握手请求中完成握手。此外,还详细描述了如何将客户端的消息进行封装,以便符合WebSocket协议。

网上找了个websocket的代码  不过只提供了服务端的处理, 对于客户端握手 以及订阅等进行了补充开发,实现了相关功能


void parse_str(char *request){
char   KEY[20]="y2g8E-f^3Bxc"; 
time_t  curtime=0;
char    sTimeStr[64];
int len;
char acDigest[65] = {0};
char acHex[129] = {0};
strcat(request, "GET / HTTP/1.1\r\n");
strcat(request, "Connection:Upgrade\r\n");
strcat(request, "Host:127.0.0.1:8088\r\n");
strcat(request, "Origin:null\r\n");
strcat(request, "Sec-WebSocket-Extensions:x-webkit-deflate-frame\r\n");
strcat(request, "Sec-WebSocket-Key:");

time(&curtime);
memset(sTimeStr, 0, sizeof(sTimeStr));
sprintf(sTimeStr,"%lld",   curtime);
len=strlen(sTimeStr);


memset(acHex,0, sizeof(acHex));
CMD5 m_oMD5;
m_oMD5.Reset();
m_oMD5.AddData(sTimeStr, len);
m_oMD5.FinalDigest(acDigest);
Binary2Hex(reinterpret_cast<unsigned char*>(acDigest), 16, acHex);

char second_md5[128];
memset(second_md5, 0, sizeof(second_md5));

strcpy(second_md5, acHex);
strcat(second_md5, KEY);


memset(acDigest,0, sizeof(acDigest));
memset(acHex,0, sizeof(acHex));
len=strlen(second_md5);
m_oMD5.Reset();
m_oMD5.AddData(second_md5, len);
m_oMD5.FinalDigest(acDigest);
Binary2Hex(reinterpret_cast<unsigned char*>(acDigest), 16, acHex);


strcat(request, acHex);
strcat(request, "==\r\n");
strcat(request, "Sec-WebSocket-Version:13\r\n");
strcat(request, "Upgrade:websocket\r\n\r\n");
}



int Websocket_Request::combile_request(char *msg, char* reqdata ){


uint16_t length=0;
int pos=0;

fin_=0x81;    // 单帧  字符串模式传输
  mask_=0x80;   //客户端请求必须使用掩码

memcpy(msg+pos, &fin_, 1);
pos++;

payload_length_=strlen(reqdata);
/*负载数据”的长度,以字节为单位:如果0-125,这是负载长度。如果126,之后的两字节解释为一个16位的无符号整数是负载长
度。如果127,之后的8  字节解释为一个64位的无符号整数(最高有效位必须是0)是负载长度。
多字节长度数量以网络字节顺序来表示。   */
if(payload_length_ > 126)    //现有业务不会需要用到4字节的数据长度  按最大两个字节长度处理
{
memset(msg+pos, 0xFE, 1);
pos++;
length=htons(payload_length_);
memcpy(msg+pos, &length, 2);
pos++;
pos++;
}
else 
{
length=mask_+ payload_length_;
memcpy(msg+pos, &length, 1);
pos++;
}

masking_key_[0]='A';
masking_key_[1]='C'; 
masking_key_[2]='D';
masking_key_[3]='b';

memcpy(msg+pos, masking_key_, 4);
pos += 4;

int j ;
uint i = 0;

for( i = 0; i < payload_length_; i++){
j = i % 4;
msg[pos + i] =reqdata[i] ^ masking_key_[j];
}

printf("WEBSOCKET PROTOCOL\n"
"FIN: %d\n"
"OPCODE: %d\n"
"MASK: %d\n"
"PAYLOADLEN: %d\n"
"PAYLOAD: %s",
fin_, opcode_, mask_, payload_length_, msg);

return 0;
}
WebSocket客户端和服务端实例源码 WebSocket ws实例 HTML5 用java实现的服务端 Websocket与服务器的正常通信 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端客户端浏览器将信息呈现,这种机制对于信息变化不是特别频繁的应用尚可,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发在处理此类业务场景时,通常采用实时通讯方案,常见的是: 轮询,原理简单易懂,就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的数据同步。问题很明显,当客户端以固定频率向服务器端发送请求时,服务器端的数据可能并没有更新,带来很多无谓请求,浪费带宽,效率低下。 基于 Flash,AdobeFlash 通过自己的 Socket 实现完成数据交换,再利用 Flash 暴露出相应的接口为 JavaScript 调用,从而达到实时传输目的。此方式比轮询要高效,且因为 Flash 安装率高,应用场景比较广泛,但在移动互联网终端上 Flash 的支持并不好。IOS 系统中没有 Flash 的存在,在 Android 中虽然有 Flash 的支持,但实际的使用效果差强人意,且对移动设备的硬件配置要求较高。2012 年 Adobe 官方宣布不再支持 Android4.1+系统,宣告了 Flash 在移动终端上的死亡。 从上文可以看出,传统 Web 模式在处理高并发及实时性需求的时候,会遇到难以逾越的瓶颈,我们需要一种高效节能的双向通信机制来保证数据的实时传输。在此背景下,基于 HTML5 规范的、有 Web TCP 之称的 WebSocket 应运而生。 早期 HTML5 并没有形成业界统一的规范,各个浏览器和应用服务器厂商有着各异的类似实现,如 IBM 的 MQTT,Comet 开源框架等,直到 2014 年,HTML5 在 IBM、微软、Google 等巨头的推动和协作下终于尘埃落地,正式从草案落实为实际标准规范,各个应用服务器及浏览器厂商逐步开始统一,在 JavaEE7 中也实现了 WebSocket 协议,从而无论是客户端还是服务端的 WebSocket 都已完备,读者可以查阅HTML5 规范,熟悉新的 HTML 协议规范及 WebSocket 支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值