由于我们公司要做的微信的H5页面是用来控制设备的,因此,与公司服务器不单单要进行http的通信,而且要实

现双工的网络通络方式,http当然就是用的JQuery的ajax方法,进行jsonp类型数据的获取方式,而在长连接方面我选

择了websocket的web技术来实现,其实websocket的代码其实相当的少,首先创造webSocket实例,代码:var ws =

new WebSocket("ws://hostlocal:8080"),其实websocket中的url可以当成tcp socket中的ip和port,然后就可以执行方法

ws.onopen作为一个用于连接打开事件的事件监听器,ws.onmessage是用来监听服务器返回的数据,ws.onclose监听

websocket是否关闭,这些都没有什么好讲的,照着搬砖就可以了。我在websocket上的主要问题是websocket既然是

基于TCP来实现的,与TCP具有一样的三次握手协议,那么websocket的客户端是否可用于基于TCP的服务器,

因为,我们公司是把APP项目移植到微信H5上,服务器上的长连接代码是现成的,所以,首先来进行了一下测试。第

一次测试时,我将16进制的协议包发送给服务器,没想到真成功了,TCP的服务器的确连上了客户端,但是但我们解

析我发送的协议包时,发现发送过来的数据并不正确,并且H5上并没有监听到连接,于是,我第二次发送了String类

型数据,服务器上获取的的数据没有发生变化。数据如下:47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A,

通过解析byte并通过ascll码发现显示为字符串为:GET / HTTP1.1 CRLF,到处看文档发现websocket虽然封装了

TCP,但是在三次握手后,客户端还要通过发送http协议传送WebSocket支持的版本号等信息,最后服务器返回相关

信息两者才能进行长连接(地址:http://blog.csdn.net/u014316363/article/details/43408325),如图:

补充:

其中,http协议最关键的是如何将Sec-webSocket-Key通过SHA1和Base64加密转换成Sec-webSocket-accept发送数据,其中mina框架的TCP对接Websocket中Sec-webSocket-Key的加密代码为:

public class keyUnit {

public Logger log = Logger.getLogger(keyUnit.class);
 
public static String getAccept(String key){
String mask = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
String accept = key + mask;
StringBuilder sb = new StringBuilder();
 
try{
MessageDigest mdDigest = MessageDigest.getInstance("SHA-1");
mdDigest.update(accept.getBytes("utf-8"),0,accept.length());
byte[] shalHash = mdDigest.digest();

System.out.println(bytesToHexString(shalHash));
accept = base64Encode(shalHash);
System.out.println(accept);
}catch(Exception e){
e.printStackTrace();
}

String rtn = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "  
                + accept + "\r\n\r\n";  
return accept;
}

public static String base64Encode(byte[] bytes){  
        return new String(Base64.encode(bytes));  
    }

public static String bytesToHexString(byte[] bytes) {
   StringBuilder sb = new StringBuilder();
   for (int i = 0; i < bytes.length; i++) {
       String hex = Integer.toHexString(0xFF & bytes[i]);
       if (hex.length() == 1) {
           sb.append('0');
       }
       sb.append(hex);
   }
   return sb.toString();
}
}

参考博客:http://147175882.iteye.com/blog/1586724

end

菜鸟日记(yzy) 微信公众号网页的开发-websocket相关推荐

  1. 微信公众号网页授权开发

    1.配置公众号信息 2.spring-boot yml配置 server:port: 80 #端口由脚本配置## 微信公众号授权 wx:mp:app-id: APPIDsecret: SECRETto ...

  2. 微信公众号网页 H5 video 标签自动播放

    目录 微信公众号网页 H5 video 标签自动播放 问题描述 解决方案 微信公众号网页 H5 video 标签自动播放 环境:微信公众号网页 需求:H5 video 标签自动播放视频 video 标 ...

  3. 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录获取手机号微信公众号网页---联合授权登录

    战前准备 1.使用 composer 安装 EasyWeChat $ composer require overtrue/wechat:~4.0 -vvv 或者在composer.json文件renq ...

  4. 微信公众号网页授权--前端获取code及用户信息(vue)

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...

  5. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】

    嗨喽大家好,前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的遇到的一些问题的见解,希望对你们有帮助. 一.测试号相关配置 首 ...

  6. php公众号开发配置网页域名,微信公众号网页开发授权配置流程

    1.配置 1.1 公众号配置 1.2 开发者账号配置 选择开发者工具->web开发者工具->绑定开发者微信账号. 1.3 开发域名配置 选择公众号设置->功能设置,根据需求设置:业务 ...

  7. 前端对接微信公众号网页开发流程,前期配置

    微信公众号网页开发,其实就是我们开发的h5网页需要放到微信浏览器环境中使用,但是需要对接公众号授权,授权之后可以获取到用户的个人信息,以及可以使用公众号提供的一些API,如:图片上传.图片预览.获取位 ...

  8. 前端对接微信公众号网页开发流程,授权对接

    前面讲到 前端对接微信公众号网页开发流程,前期配置,本篇文章主要详细介绍关于公众号的授权对接. 一.引入微信js-sdk 在需要调用 JS 接口的页面引入如下 JS 文件 http://res.wx. ...

  9. 微信公众号网页授权思路解析及具体代码

    微信公众号网页授权思路解析及具体代码 微信开发文档 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静 ...

  10. uniapp开发微信公众号网页-微信JSSDK使用

    uniapp开发微信公众号网页-微信JSSDK使用 一. 安装jweixin-module 二. 新建js文件,把jssdk的接口简单封装,然后挂载到vue实例 1. 在js公共文件夹下创建wecha ...

最新文章

  1. Codeforces 300E(数学)
  2. 基于生成对抗网络(GAN)的人脸变形(附链接) | CSDN博文精选
  3. OpenCV On Android
  4. 第十六课.基于K-means的图像分割
  5. Xshell6和Xftp下载地址,rzsz的使用
  6. 【采用】反欺诈之血缘关系分析和犯罪传导监测 - 知识图谱
  7. 牛客网——最简真分数
  8. 求f(x,n)(信息学奥赛一本通-T1166)
  9. List<?> list= new ArrayList<?>接口引用指向实现类的对象.
  10. 请注意调整好自己的心态
  11. ipad分屏大小怎么调整_flash怎么调整元素大小-Adobe flash统一图形大小的方法
  12. 浅谈RNN、LSTM + Kreas实现及应用
  13. 百度Android在线语音识别SDK用法
  14. ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware
  15. ORACLE中的KEEP()使用方法
  16. 数值计算笔记之数值积分(一)
  17. I/O函数 writel __raw_writel mb()/rmb()/wmb()
  18. Symbol - 看似平凡的Symbol其实我们每天都在用 - 对象操作
  19. [附源码]Java计算机毕业设计SSM大学生运动员健康管理系统
  20. 文化产业如何面对大数据时代

热门文章

  1. 高效解答二进制数“多异或”和“多同或”连续运算问题
  2. 微信H5域名被屏蔽被拦截的最新解决方案(微信域名防投诉)
  3. C语言用数组模拟实现栈(LIFO)
  4. 极客也可以很亲民,酷炫设计、多变造型的华为智能眼镜即将发布
  5. 支持笔锋效果的手写签字控件
  6. WGL中的Scan信息的解析
  7. 根据页面结构,用jquery取里面对应的内容 组装成json数据
  8. 漫画:用木兰从军说外观模式
  9. 罗振宇2021跨年演讲5:为什么你要建成自己的“黄鹤楼”?
  10. servlet+js实现首页、尾页、下一页、上一页(翻页功能)