先说WebSocket的客户端,用Javascript写就行

var websocekt=new WebSocket("ws://127.0.0.0:8888");//8888是端口号websocket.onopen=function(event){    //...当连接成功会执行这里的代码}

对于WebSocket,连接成功是实现握手。

服务端先运行着,这边打开客户端,客户端建立websocket,就会向其指定的服务端地址端口发送一个

HTTP请求,大概如下:

GET / HTTP/1.1Upgrade: websocketConnection: UpgradeHost: 127.0.0.1:8888Origin: nullPragma: no-cacheCache-Control: no-cacheSec-WebSocket-Key: CoIrEpLMznRgAYho/n3ooQ==Sec-WebSocket-Version: 13Sec-WebSocket-Extensions: x-webkit-deflate-frameUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

这就是客户端建立websocket时发往服务端的请求消息

服务端也要加应一个相应的消息到客户端,成功了才算握手成功,才能开始正式的通信

注意其中的Sec-WebSocket-Key

服务端返回握手信息需要用到这个Key,拿这个Key生成一个Sec-WebSocket-Accept,加到返回信息中回送给客户端

我们建个服务端

public class Server {    public Server() throws Exception{        ServerSocket ss=new ServerSocket(30000);        Socket socket=ss.accept();        InputStream in=socket.getInputStream();        OutputStream out=socket.getOutputStream();        byte[] buff=new byte[1024];        int count=-1;        String req="";        count=in.read(buff);        req=new String(buff, 0, count);        System.out.println("握手请求:"+req);        String secKey=getSecWebSocketKey(req);        System.out.println("secKey="+secKey);        String response="HTTP/1.1 101 Switching Protocols\r\nUpgrade: "        +"websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "        +getSecWebSocketAccept(secKey)+"\r\n\r\n";        System.out.println("Sec-Accept="+getSecWebSocketAccept(secKey));        out.write(response.getBytes());        count=in.read(buff);        System.out.println("接收的字节数:"+count);        for(int i=0;i

其中Base64Encoder是在包sun.misc下,eclipse下需要在项目的BuildPath中对JRE中的Access rules进行设置。

页面这边

    
        var webSocket=new WebSocket("ws://127.0.0.1:8888");webSocket.onopen=function(){alert("已打开连接");webSocket.send("我是谁");};webSocket.onmessage=function(event){alert("收到的消息是:"+event.data);};webSocket.onclose=function(event){alert("close");};    

先运行Server,再打开网页就会看到效果