tomcat+websocket实现

来源:互联网 发布:unity3d 性能测试工具 编辑:程序博客网 时间:2024/06/06 02:10
</pre><span style="font-size:24px;"><strong>前言:WebSocket技术是HTML5的一种协议,它实现的浏览器与服务器全双工通信。</strong></span><p><span style="font-size:24px;"><strong>现在很多的实时通讯技术,一般采用的都是轮询方式,设置一个时间间隔,比如说3秒,不断的向服务器发出HTTP request,然后由服务器返回数据给客户端。这时候就会出现一个问题。比如:我们后台5-10秒产生一个新数据,怎么去定义请求时间隔呢?而且,不断的请求服务器,势必给它带来额外的压力。而WebSocket的优势显而易见。浏览器与服务器仅需要一次握手动作,之后他们之间就构成了一条快速通道,两者之间可以相互推送数据。下面我们就一起来看怎么实现这种websocket技术。</strong></span></p><p><pre name="code" class="java"><strong><span style="font-size:18px;">1、客户端</span></strong>

客户端代码很简单,通过下面代码即可完成。

<!DOCTYPE html><html>  <head>    <title>MySocket</title>    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>    <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>    <script type="text/javascript">    var webSocket = null;    var flag = true;//全局标记位,标记浏览器是否支持websocket    $(function(){        if(!window.WebSocket){            $("body").append("<h1>你的浏览器不支持WebSocket</h1>");            flag = false;            return;        }            });    function startConnect(){        if(flag == false){            return;        }        var url = "ws://localhost:8080/Web/websocket";        webSocket = new WebSocket(url);                webSocket.onerror = function(event) {            onError(event);        };        webSocket.onopen = function(event) {            onOpen(event);        };        webSocket.onmessage = function(event) {            onMessage(event);        };    }    function onMessage(event) {        $(".well").append("<li>" + event.data + "</li>");    }    function onOpen(event) {        $(".well").append("<li>连接至服务器</li>");    }    function onError(event) {        $(".well").append("<li>连接服务器发生错误</li>");    }    function sendMessage(){        var msg = "[" + $("#username").val() + "]:" + $("#message").val();//获取发送信息        webSocket.send(msg);//向服务器发送消息        $("#message").val("");//清空消息    }    function stopMessageBtn(){   webSocket.close();   $(".well").append("<li>服务器已停止</li>");    }    </script>  </head>    <body>        <ul class="well">        <li>提示:点击开始连接将连接到服务器</li>    </ul>    <input type="button" class="btn btn-default" value="开始连接" id="startBtn" onclick="startConnect()" /><br/><br/>    输入名称:<input id="username" value="<%=(int)(Math.random() * 1000) %>" style="width: 50px;margin-right:5px;" />    <input id="message" class="form-control" />    <input type="button" class="btn btn-default" value="发送消息" id="sendMessageBtn" onclick="sendMessage()" />    <input type="button" class="btn btn-default" value="停止消息" id="stopMessageBtn" onclick="stopMessageBtn()" />  </body></html>


var url = "ws://localhost:8080/Web/websocket";webSocket = new WebSocket(url);<pre name="code" class="html">webSocket.send(msg)方法向服务器发送消息。

第1行代码,我们创建一个URL。参数是需要连接的服务器端的地址,同http协议使用http://开头一样,WebSocket协议的URL使用ws://开头

另外安全的WebSocket协议使用wss://

第2行正式建立websocket的连接。

第3行send方法向服务器发送消息,在实际的业务里,msg可以封装成我们自己所需的参数格式。

2、服务端

服务端,这里我们用TOMCAT来实现,需要注意的是,Tomcat版本需高于7.0.47。这里所使用的是tomcat7.0.69。点击下载

package com.websocket;import java.io.IOException;import java.util.Queue;import java.util.concurrent.ConcurrentLinkedQueue;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;@ServerEndpoint("/websocket")public class WebSocketTest {    /**     * 存储当前有效的session对象     */    private static Queue<Session> sessionSet = new ConcurrentLinkedQueue<Session>();        @OnMessage    public void onMessage(String message, Session session) throws IOException, InterruptedException {        System.out.println("进入onMessage方法");        /** 注释部分为发送广播信息,即所有连接了websocket的客户端    for(Session sess:sessionSet){    sess.getBasicRemote().sendText(message);    }**/        while(true){    Thread.sleep(1000);    session.getBasicRemote().sendText(message);    System.out.println("Session为--"+session.getId()+"--的服务器正在推送数据!");    }    }    @OnOpen    public void onOpen(Session session) {        if(sessionSet.contains(session) == false){            sessionSet.add(session);            System.out.println("建立连接!Session为:"+session.getId());        }    }    @OnClose    public void onClose(Session session) {        if(sessionSet.contains(session)){            sessionSet.remove(session);        }        System.out.println("关闭连接!Session为:"+session.getId());    }        @OnError    public void onError(Session session , Throwable throwable) {    System.out.println("服务器发生错误,Session为:"+session.getId() + "---" + throwable.getMessage());    onClose(session);    }    public static Queue<Session> getSessionSet() {        return sessionSet;    }}

如下图所示,需引入Tomcat所需的包

切记一点:在部署完项目,需在tomcat部署的完路径下删掉websocket包,否则客户端报错404,连接不上



0 0
原创粉丝点击