当前位置: 首页 > news >正文

网站客户续费杭州软件app制作公司

网站客户续费,杭州软件app制作公司,福田公司是国企吗,wordpress免费模板下载websocket server的优点 websocket server的好处#xff1a;WebSocket 服务器能够实现实时的数据推送#xff0c;服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活#xff0c;我们发送数据的时候比较…websocket server的优点 websocket server的好处WebSocket 服务器能够实现实时的数据推送服务器可以主动向客户端发送数据 1 不需要客户端不断轮询。 2 不需要实现httpserver跨域。 在需要修改协议的时候比较灵活我们发送数据的时候比较方便因为两边可以随时发送协议 且做客户端的程序更为方便websocket协议头部已经定义了包长使用大部分库可以直接收数据解决了粘包的问题所以websocket协议是一个使用比较顺畅的协议 实现websocket server 先用boost 的协程顶一下主要是需要将http协议升级到websocket 因此在一个函数里面实现两种server的接收http协议顺便就接收了同时在客户端里面存储所有的链接对象以下是主要实现的握手协议代码以供参考 bool func_hand_shake(boost::asio::yield_context yield){DEFINE_ECasio::streambuf content_;size_t length asio::async_read_until(v_socket, content_, \r\n\r\n, yield[ec]);ERROR_RETURN_FALSEasio::streambuf::const_buffers_type bufs content_.data();std::string lines(asio::buffers_begin(bufs), asio::buffers_begin(bufs) length);//std::coutlinesstd::endl;c_header_map hmap;//std::string get;int protocol fetch_head_info(lines, hmap, v_app_stream);if (protocol ! GET)return false;cout GET: v_app_stream endl; //like this-- live/1001 rtmp server must like thisauto iter hmap.find(Upgrade);if (iter hmap.end()){//it is the http protocol ,not websocket//func_hand_http(m, yield);size_t ret boost::asio::async_write(v_socket, boost::asio::buffer(FLV_HTTP_HEADERS,FLV_HTTP_HEADERS_LEN), yield[ec]);//ERROR_RETURN_FALSEv_key hash_add(v_app_stream.c_str(), HASH_PRIME_MIDDLE);if (c_hubs::instance()-push(v_key, shared_from_this(), true) !0){//we can not find the stream //return 404 errorif (ret -1){size_t len_ sizeof(buffer404) - 1; //remove the \0 one bytesasio::async_write(v_socket, asio::buffer(buffer404, len_), yield[ec]);//ERROR_RETURN_FALSE//return false;}return false;}return true;}else{v_iswebsocket true;std::string response, key, encrypted_key;//find the get//std::string request;size_t n lines.find_first_of(\r);//find the Sec-WebSocket-Keysize_t pos lines.find(Sec-WebSocket-Key);if (pos lines.npos)return false;size_t end lines.find(\r\n, pos);key lines.substr(pos 19, end - pos - 19) 258EAFA5-E914-47DA-95CA-C5AB0DC85B11;//get the base64 encode string with sha1 #if 0boost::uuids::detail::sha1 sha1;sha1.process_bytes(key.c_str(), key.size());unsigned int digest[5];sha1.get_digest(digest); #endif #if 1SHA1 sha;unsigned int digest[5];sha.Reset();sha key.c_str();sha.Result(digest); #endiffor (int i 0; i 5; i) {digest[i] htonl(digest[i]);}encrypted_key base64_encode(reinterpret_castconst uint8_t*(digest[0]), 20);//base64_encode(first, encrypted_key);/*The handshake from the server looks as follows :HTTP / 1.1 101 Switching ProtocolsUpgrade : websocketConnection : UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK xOo Sec-WebSocket-Protocol: chat*///set the response textresponse.append(HTTP/1.1 101 WebSocket Protocol Handshake\r\n);response.append(Upgrade: websocket\r\n);response.append(Connection: Upgrade\r\n);response.append(Sec-WebSocket-Accept: encrypted_key \r\n\r\n);//response.append(Sec-WebSocket-Protocol: chat\r\n);//response.append(Sec-WebSocket-Version: 13\r\n\r\n);size_t ret boost::asio::async_write(v_socket, boost::asio::buffer(response), yield[ec]);//ERROR_RETURN_FALSE//calculate the hash key v_key hash_add(v_app_stream.c_str(), HASH_PRIME_MIDDLE);c_hubs::instance()-push(v_key, shared_from_this(),false);}return true;}rtmp协议 这个协议太过出名实在没什么好说的 实现http协议 实现websocket协议的时候顺带实现使用map数据结构存储 转发单线程去除队列 1 数据共享 在发送数据的时候rtmp 和 httpflv发送 以及 websocket发送使用同一缓存这样有一个问题即使我们使用共享的数据结构同时使用同一个内存也不一定会共享申请内存时多余的头部以下是数据结构 typedef struct s_memory {//head uint8_t *v_data NULL;//v_data_h rtmp use ituint8_t *v_data_h NULL;//real datauint8_t *v_data_r NULL;//uint8_t *v_data NULL;size_t v_len;uint32_t v_ts; // timestampen_flv_header v_av_type en_flv_null;void memory_create(uint32_t size, int header 18){//zero copy//the last reserve 4 bytes for flv write 4 bytes tail for av data size//the header 18 bytes for max rtmp usev_data new uint8_t[size header 4];v_len size; //not include the header and tail //we do not know the head where//v_data_h v_data;v_data_r v_data header;}void memory_create(uint32_t size, int header, int tail){v_data new uint8_t[size header tail];v_len size; //not include the header and tail v_data_h v_data;v_data_r v_data header;}~s_memory(){if (v_data ! NULL)delete[] v_data;} }s_memory;这边要做的就是在申请内存时多申请上头部和尾部这样使用的时候就可以在数据前面增加不同协议的数据头部。 所以是下面这句话 v_data new uint8_t[size header tail];读者自行理解就好 收到数据以后不进行任何的数据拷贝 在缓冲数据前面加上数据头部立刻发送出去上图可以看到rtmp协议和websocket flv 同时打开vlc的rtmp协议稍稍会延后一点时间。两路内存占用如下图所示 可以看到去除队列积压内存占用比较小 多个线程需要修改头部的情况 如果使用多个线程如何在各类协议之间共享数据呢这是个问题我们退而求其次利用tcp 协议的特点它是可以分开来发送批量数据,下图是使用websocket协议发送flv数据的示例包括发送tagtaglendatadatalen 以及自身websocket发送的头部字节分了三次发送head和headlen 是实现websocket的头部而写。 /*sock : need send socketdata : flv av datadatalen : flv av data len */ bool c_flvserver::func_set_head_send(tcp::socket sock,uint8_t* tag, int taglen, uint8_t *data, size_t datalen,asio::yield_context yield) {uint8_t buffer[10];uint8_t *head NULL;// buf;// 0x82;int headlen 0;int totallen taglen datalen;if (totallen 65535){if (totallen 126){head buffer[0] 8;//relen 1;*head 0x82; //0x81:1000 0001 text code ; // 1000 0010 binary code*(head 1) (uint8_t)totallen;headlen 2;}else //126 65536{head buffer[0] 6;*head 0x82;*(head 1) 126;*(head 2) (uint8_t)((totallen 8) 0xFF);*(head 3) (uint8_t)(totallen 0xFF);headlen 4;}}else //65535{head buffer[0];*head 0x82;*(head 1) 127;*(head 2) 0; //56*(head 3) 0; //48*(head 4) 0;// 40*(head 5) 0; // 32;*(head 6) (uint8_t)(totallen 24);*(head 7) (uint8_t)(totallen 16);*(head 8) (uint8_t)(totallen 8);*(head 9) (uint8_t)(totallen 0xFF);headlen 10;}DEFINE_ECasio::async_write(sock, asio::buffer(head, headlen), yield[ec]);asio::async_write(sock, asio::buffer(tag, taglen), yield[ec]);asio::async_write(sock, asio::buffer(data, datalen), yield[ec]);//send the data//flv_const_buffer bb(frame, framelen,tag,taglen, data, dlen);//asio::async_write(sock, bb, yield[ec]);return ec? false : true; }这样在发送rtmp协议的时候使用申请内存的多余头部空间发送flv的时候 previous tag 长度四字节放在尾部发送http协议的时候和flv类似不需要发送websocket的头部字节后面加上各类协议比如rtsp 的tcp等等也可以这样做我们可以拷贝但也可以不拷贝数据而进行零拷贝零队列发送。 下面多打开几路观察内存 如下图所示和刚才区别不大小于10路内存都在1兆多以内 后面需要做的实现 实现更多的具体行业应用层服务和比较标准的协议输出 将会做客户端发流客户端收留服务器对接服务调用gpu等等会比较谨慎。
http://www.w-s-a.com/news/768760/

相关文章:

  • 永州网站seo德阳网站建设优化
  • 网站建设高端网站本地建设网站软件下载
  • 网站后台账号密码破解杭州酒店网站设计公司推荐
  • 和县网站开发秦皇岛建设工程信息网站
  • 国外网站用什么dns好建一个下载网站要什么cms系统
  • 礼品工艺品网站建设手机做网站哪家好
  • 泉州网站建设方案维护怎样选择网站建设
  • 江苏建站速度忿先进的网站建设
  • 广州天河建站公司com域名注册多少钱
  • 成都网站建设推广好vs2013如何做网站
  • 茶叶网站建设模板企业网站备案要多少钱
  • 怎么查网站找谁做的win主机伪静态规则 wordpress
  • 轻云服务器菁英版 多个网站北京it外包服务商
  • 售后服务 网站建设阳江seo优化
  • 网站建设后怎么赚钱wordpress调用导航栏
  • 特产网站设计六色网站
  • 服务器网站备案做网站公司如何赚钱
  • 怎样进行站点优化荣成市有做网站的吗
  • 合肥建设工会网站芜湖做网站建设公司
  • 玉林市住房和城乡建设局网站网站开发百灵鸟
  • 网站怎么做双机房切换建设部网站2015年第158号
  • 郑州服务设计公司网站色块的网站
  • 网站设计所用到的技术做网站添加mp3
  • 凡科做的微网站怎样连接公众号seo李守洪排名大师
  • 温州网站开发网站的制作东莞寮步伟易达电子厂
  • 北京网站设计制作关键词优化微信小程序开发推广网站建设优化规划书
  • 杭州临平网站建设开发公司将购房款划给总公司的法律责任
  • 广东外贸网站推广分类wordpress
  • 聚美优品网站建设方案商城和营销型网站建设
  • 比较著名的seo网站如何建设网站?