jee websocket搭建总结

1、使用框架spring+springmvc+mybatis+jdk7+tomcat7+maven

2、基本原理:

    a. WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是 它和http最大的不同有两点:

                   1.WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动地向对方发送或接收数据,就像Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;

                   2.WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。

    b.struts   和 websocket  是2条处理请求的路,被struts 匹配上了 ,自然就到不了 websocket的处  理逻辑,(http和ws是两种不同的请求协议,注意框架的拦截器(过滤器))

3、客户端:

<html>
<head>
    <title>Title</title>
    <style>

        div {
            margin-left: auto;
            margin-right: auto;
        }


    </style>
</head>
<body onLoad="startWebSocket()">
<script type="text/javascript">
    function clog(title) {
        console.log(title);
    }

    var ws = null;
    function startWebSocket() {

        if ('WebSocket' in window) {

            try {
                ws = new WebSocket("ws://127.0.0.1:80/websocket/tui");
            } catch (e) {
                clog("1");
            }
        } else if ('MozWebSocket' in window) {
            ws = new MozWebSocket("ws://127.0.0.1:80/websocket/tui");
        } else {
            clog("websocket not support");
        }

        ws.onmessage = function (evt) {
            say(evt.data);
        };

        ws.onclose = function (evt) {
            clog("close!");
        };

        ws.onopen = function (evt) {
            clog("open");
        };
    }

    function sendMsg() {
        ws.send(document.getElementById('writeMsg').value);
    }

    function say(msg) {
        var div = document.createElement("div");
        div.innerHTML = msg;
        document.body.appendChild(div);
    }

</script>
<div onClick="say('d')">WebSocket聊天室</div>
<div style="border:1px solid #09F"></div>
<input type="text" id="writeMsg"/>
<input type="button" value="send" onClick="sendMsg()"/>

</body>
</html>

4、服务端:

@ServerEndpoint(value = "/websocket/tui")
public class WebSocketDemo{
    private static final String GUEST_PREFIX = "Guest";
    private static final AtomicInteger connectionIds = new AtomicInteger(0);
    private static final Set<WebSocketDemo> connections = new HashSet<>();

    private final String nickname;
    private Session session;

    public WebSocketDemo() {
        nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
    }

    //建立连接
    @OnOpen
    public void start(Session session) {
        this.session = session;
        connections.add(this);
        String message = String.format("* %s %s", nickname, "has joined.");
        System.out.println(message);
    }

    //接受消息
    @OnMessage
    public void incoming(String message) {
        System.out.println(message.toString());
        //broadcast(filteredMessage);
        broadcast(message.toString());
    }

    //客户端关闭了连接
    @OnClose
    public void end() {
        connections.remove(this);
        String message = String.format("* %s %s", nickname, "has disconnected.");
        System.out.println(message);
        //broadcast(message);
    }

    //WebSocket服务出错
    @OnError
    public void onError(Throwable t){
        //log.error("Chat Error: " + t.toString(), t);
        System.out.println("server has an error!");
    }

    private static void broadcast(String msg) {
        for (WebSocketDemo client : connections) {
            try {
                synchronized (client) {
                    client.session.getBasicRemote().sendText(msg);
                }
            } catch (IOException e) {
                //log.debug("Chat Error: Failed to send message to client", e);
                connections.remove(client);
                try {
                    client.session.close();
                } catch (IOException e1) {
                    // Ignore
                }
                String message = String.format("* %s %s",
                        client.nickname, "has been disconnected.");
                broadcast(message);
            }
        }
    }
}

注意事项:

         1、访问拦截器

         2、注意部署的包冲突,例如:javax.websocket只是编译需要,而发布不需要,maven依赖注意适用范围

         附:

<!--websocket编译需要,发布不需要-->
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-coyote -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-coyote</artifactId>
    <version>7.0.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-juli -->
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-juli</artifactId>
    <version>8.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api -->
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.1</version>
    <scope>provided</scope>
</dependency>

 

posted @ 2017-01-03 18:07  构建巨人肩膀  阅读(817)  评论(0编辑  收藏  举报