关闭

tomcat+websocket实现

标签: Javawebsockettomcat
1012人阅读 评论(0) 收藏 举报
分类:
</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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1516次
    • 积分:30
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档