java_websocket详解(一)

原创 2017年01月03日 17:49:11
关于websocket的资料,网上一搜一大堆,而且内容还不太相同,对于那些刚接触websocket的童鞋来说很绕,看起来很蛋疼。
首先说一下websocket协议,网络上多如牛毛,估计原作没有几个,都他妈抄的,然后稍微改几个字(夸张了点额)!
先说一下,draft_10,draft_17,draft_75,draft_76,关于这几个的区别,网上资料太少了,中文的几乎绝迹。。。
通过java_websocket的源码,讲解一下。
draft_10,draft_17,只是Sec-WebSocket-Version版本不一样,draft_10的Sec-WebSocket-Version是8,draft_17的Sec-WebSocket-Version是13

draft_10的如下,

public HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) throws InvalidHandshakeException {
        int v = readVersion( handshakedata );
        if( v == 7 || v == 8 )// g
            return basicAccept( handshakedata ) ? HandshakeState.MATCHED : HandshakeState.NOT_MATCHED;
        return HandshakeState.NOT_MATCHED;
    }

draft_17的如下,

    public HandshakeState acceptHandshakeAsServer( ClientHandshake handshakedata ) throws InvalidHandshakeException {
        int v = readVersion( handshakedata );
        if( v == 13 )
            return HandshakeState.MATCHED;
        return HandshakeState.NOT_MATCHED;
    }

首先,我们打开一个客户端,客户端会发一个握手请求

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13 

然后,服务端就会回一个:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat


    public HandshakeState acceptHandshakeAsClient( ClientHandshake request, ServerHandshake response ) throws InvalidHandshakeException {
        if( !request.hasFieldValue( "Sec-WebSocket-Key" ) || !response.hasFieldValue( "Sec-WebSocket-Accept" ) )
            return HandshakeState.NOT_MATCHED;

        String seckey_answere = response.getFieldValue( "Sec-WebSocket-Accept" );
        String seckey_challenge = request.getFieldValue( "Sec-WebSocket-Key" );
        seckey_challenge = generateFinalKey( seckey_challenge );

        if( seckey_challenge.equals( seckey_answere ) )
            return HandshakeState.MATCHED;
        return HandshakeState.NOT_MATCHED;
    }

上面一段就是服务端对客户端的握手代码。

我们再来看一下Sec-WebSocket-Accept这个值是怎么实现的

    private String generateFinalKey( String in ) {
        String seckey = in.trim();
        String acc = seckey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
        MessageDigest sh1;
        try {
            sh1 = MessageDigest.getInstance( "SHA1" );
        } catch ( NoSuchAlgorithmException e ) {
            throw new RuntimeException( e );
        }
        return Base64.encodeBytes( sh1.digest( acc.getBytes() ) );
    }

这个就和其它资料上的一样了,Sec-WebSocket-Key的值 +”258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,进行SHA1运算后,再进行base64加密。

帧处理看下一篇。

java WebSocket 简易聊天消息推送

环境:
  • hzw2312
  • hzw2312
  • 2014年11月18日 20:02
  • 43759

Js WebScoket与Java WebSocket的通信

不喜欢说废话,直接上代码←← 在myeclise里面新建一个项目,项目名命名为websocke,请使用java ee7.0或以上web环境。 1,在WebRoot下新建一个demo.h...

Java后端WebSocket的Tomcat实现

一.WebSocket简单介绍   随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全...

WebSocket原理及技术简介

WebSocket原理及技术简介 目录 1    引言    1 2    WebSocket技术及协议    2 2.1    WebSocket API    2 2.1.1    ...

Java Websocket实例【项目实战系列】

现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这...

看完让你彻底搞懂Websocket原理

偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有。所以转到我博客里,分享一下。比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗...

websocket 版本13的 握手算法

问题终于搞好了,因为我用的是 Chrome  16.0.912.63,这个版本实现的是最新的HTML5 Websocket草案10的协议。而上面websocket4j实现在还是以前版本的协议。下面是草...

基于Tomcat7、Java、WebSocket的服务器推送聊天室

前言         HTML5 WebSocket实现了服务器与浏览器的双向通讯,双向通讯使服务器消息推送开发更加简单,最常见的就是即时通讯和对信息实时性要求比较高的应用。以前的服...

Java WebSocket编程与网页简易聊天室

在webSocket还未引入前,许多开发人员通过各种非正规手段来完成更新网站的最新信息和到所有当前访问者的任务,其中一种手段就是通过浏览器向服务器轮询更新,但这种手段的网络延迟比较明显,其用户体验比较...
  • liu_c_y
  • liu_c_y
  • 2016年06月29日 21:08
  • 6597

Spring - Websocket详细配置

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Co...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java_websocket详解(一)
举报原因:
原因补充:

(最多只允许输入30个字)