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

由于我们公司要做的微信的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),如图:

菜鸟日记(yzy) 微信公众号网页的开发-websocket_第1张图片

补充:

其中,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


你可能感兴趣的:(微信公众号和小程序开发)