Websocket

# Websocket

Jboot 内置了 Undertow 服务器,完美支持 websocket 功能, tomcat8 也是内置了对 websocket 的支持。

在使用 websocket 之前,需要添加如下配置:

jboot.web.webSocketEndpoint=your-endpoint-class-name

例如:

//多个 endpoint 用英文逗号(,) 隔开。
jboot.web.webSocketEndpoint=io.jboot.test.websocket.WebsocketDemo

WebsocketDemo 的代码如下:

package io.jboot.test.websocket;

import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint("/myapp.ws")
public class WebsocketDemo {

    @OnMessage
    public void message(String message, Session session) {
        for (Session s : session.getOpenSessions()) {
            System.out.println("receive : " + message);
            s.getAsyncRemote().sendText(message);
        }
    }
}

这里要注意:@ServerEndpoint("/myapp.ws") 中的内容 /myapp.ws 必须有后缀,后缀可以自定义,否则会被 JFinal 的拦截。

我们还需要写一个 Controller,来渲染 html 页面。

@RequestMapping("/websocket")
public class WebsocketController extends JbootController {

    public void index() {
        render("/websocket.html");
    }

}

websocket.html 的内容如下:

<html>
<head><title>Undertow Chat</title>
    <script>
        var socket;
        if (window.WebSocket) {
            // 这里的 /myapp.ws 必须和以上 @ServerEndpoint("/myapp.ws") 
            // 中配置的内容保持一致
            socket = new WebSocket("ws://127.0.0.1:8080/myapp.ws");
            socket.onmessage = function (event) {
                var chat = document.getElementById('chat');
                chat.innerHTML = chat.innerHTML + event.data + "<br />";
            };
        } else {
            alert("Your browser does not support Websockets. (Use Chrome)");
        }

        function send(message) {
            if (!window.WebSocket) {
                return false;
            }
            if (socket.readyState == WebSocket.OPEN) {
                socket.send(message);
            } else {
                alert("The socket is not open.");
            }
            return false;
        }
    </script>
    <style type="text/css">
        html,body {width:100%;height:100%;}
        html,body,ul,ol,dl,li,dt,dd,p,blockquote,fieldset,legend,img,form,h1,h2,h3,h4,h5,h6 {margin:0;padding:0;}
        body {
            font:normal 12px/1.5 Arial,Helvetica,'Bitstream Vera Sans',sans-serif;
            background: #c5deea; /* Old browsers */
            background: -moz-linear-gradient(top, #c5deea 0%, #066dab 100%); /* FF3.6+ */
            background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c5deea), color-stop(100%, #066dab)); /* Chrome,Safari4+ */
            background: -webkit-linear-gradient(top, #c5deea 0%, #066dab 100%); /* Chrome10+,Safari5.1+ */
            background: -o-linear-gradient(top, #c5deea 0%, #066dab 100%); /* Opera 11.10+ */
            background: -ms-linear-gradient(top, #c5deea 0%, #066dab 100%); /* IE10+ */
            background: linear-gradient(to bottom, #c5deea 0%, #066dab 100%); /* W3C */
            height: 90%;
        }

        .center {
            margin-left: auto;
            margin-right: auto;
            width: 70%;
            background: white;
        }

        .chatform {
            margin-left: auto;
            margin-right: auto;
            margin-bottom: 0;
            width: 70%;
        }
        form{
            width: 100%;
        }
        label{
            display: inline;
            width: 100px;
        }
        #msg{
            display: inline;
            width: 100%;
        }

    </style>
</head>
<body>
<div class="page">
    <div class="center" >
        <h1>JSR-356 Web Socket Chat</h1>
        <div id="chat" style="height:100%;width: 100%; overflow: scroll;">


        </div>

        <form onsubmit="return false;" class="chatform" action="">
            <label for="msg">Message</label>
            <input type="text" name="message" id="msg"  
            onkeypress="if(event.keyCode==13) { send(this.form.message.value); this.value='' } " />
        </form>
    </div>
</div>
</body>
</html>