基於tomcat的websock+struts2使用

1.需要引入的加包tomcat7-websocket.jar和websocket-api.jar,可以在tomcat自帶的lib目錄中找到;

2.在web.xml中加入監聽

	<listener>
		<listener-class>org.apache.tomcat.websocket.server.WsContextListener</listener-class>
	</listener>

3.在項目中加入配置類ScanWebSocketSeverConfig.java

import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by D.chen.g on 2018/4/20.
 */
public class ScanWebSocketSeverConfig implements ServerApplicationConfig {

    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) {

        Set<ServerEndpointConfig> result = new HashSet<>();
        return result;
    }

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
        Set<Class<?>> results = new HashSet<Class<?>>();
        for (Class<?> clazz : scanned) {

            if (clazz.getName().equals("com.app.struts.socket.EchoExample")) {//換成你自己websock使用類
                System.out.println("find end point : " + clazz.getName());
                results.add(clazz);
            }
        }
        return results;
    }

}

4.在項目中加入使用類EchoExample

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * Created by D.chen.g on 2018/4/20.
 */

@ServerEndpoint(value = "/echo")
public class EchoExample {

    @OnOpen
    public void openConn(Session session) throws IOException {
        session.getBasicRemote().sendText("hello web socket"); // means open it
    }

    @OnClose
    public void onClose(){
        System.out.println(" connection closed ");
    }

    @OnMessage
    public void onMessage(String message,Session session)
            throws IOException, InterruptedException
    {
        System.out.println("***************"+message);
        session.getBasicRemote().sendText("  this is  message");
        int sentMessage = 0;
        while(sentMessage < 3){
            Thread.sleep(5000);
            session.getBasicRemote().sendText(" this is one mess " + sentMessage);
            sentMessage++;
        }
        session.getBasicRemote().sendText(" message send over ");
    }
}

5.在struts.xml中加入過濾

 <constant name="struts.action.excludePattern" value="/ws/.*,ws://.*"></constant>

6.前端頁面test.html

<html>
<head>
    <title>Web Socket Echo Test</title>
    <script>
        var ws = null;
        var count = 0;
        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('echo').disabled  = !connected;
        }

        function connect() {
            var target = document.getElementById('target').value;
            if (target == '') {
                alert('Please select server side connection implementation.');
                return;
            }

            if ('WebSocket' in window) {
                ws = new WebSocket(target);
            } else if ('MozWebSocket' in window) {
                ws = new MozWebSocket(target);
            } else {
                alert('WebSocket is not supported by this browser.');
                return;
            }

            ws.onopen = function () {
                setConnected(true);
                log('Info: WebSocket connection opened.');
            };
            ws.onmessage = function (event) {
                log('Received: ' + event.data);
                if(event.data instanceof ArrayBuffer)
                {
                    var bytes = new Uint8Array(event.data);
                    alert(bytes.length + " : " + bytes[0]);
                }
            };
            ws.onclose = function (event) {
                setConnected(false);
                log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason));
            };

        }

        function disconnect() {
            if (ws != null) {
                ws.doClose();
                ws = null;
            }
            setConnected(false);
        }

        function echo() {
            if (ws != null) {
                var message = document.getElementById('message').value;
                log('Sent: ' + message);
                ws.send(JSON.stringify({'textMessage': message}));
                count++
            } else {
                alert('WebSocket connection not established, please connect.');
            }
        }

        function log(message) {
            var echomsg = document.getElementById('echomsg');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            echomsg.appendChild(p);
            while (echomsg.childNodes.length > 25) {
                echomsg.removeChild(console.firstChild);
            }
            echomsg.scrollTop = console.scrollHeight;
        }

        document.addEventListener("DOMContentLoaded", function() {
            // Remove elements with "noscript" class - <noscript> is not allowed in XHTML
            var noscripts = document.getElementsByClassName("noscript");
            for (var i = 0; i < noscripts.length; i++) {
                noscripts[i].parentNode.removeChild(noscripts[i]);
            }
        }, false);
    </script>
</head>
<body>
<div>
    <!--xxx爲你的web項目訪問根目錄-->
    <h4>URL - ws://localhost:8080/xxx/echo</h4>
    <input id="target" type="text" size="40" style="width: 350px" />
</div>
<div>
    <button id="connect" onclick="connect();">Connect</button>
    <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
</div>
<div>
    <textarea id="message" style="width: 350px">Here is a message!</textarea>
</div>
<div>
    <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>
</div>
<div id="echomsg">
</div>
</body>
</html>
7.如果在發佈時使用了nginx,前端頁面連接請用服務器IP和端口訪問websock服務,實測使用域名不行。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章