Websocketはデータベースを動的にリスニングし、データが変化した場合にページデータを更新します.デッドサイクルとデータのredisへのキャッシュを防止

25006 ワード

ページの接続:
function websocket(){
    if ("WebSocket" in window){//         websocekt
        //var host = "ws://localhost/websocketindex/"//       Ip   
         var socket = new WebSocket(host);
         try {
             socket.onopen = function()//  socekt
             {
            	 console.log("WebSocket    ");
             };
             socket.onmessage = function(event)//  socekt
             {
            	 console.log(event.data);
         	    if(event.data=="1"){
         	        console.log("     ");
         	        socket.send("    ");
         	    }
         
             };
             socket.onclose = function()//  socekt  
             {
            	 console.log("WebSocket    ");
                 socket.close();
             };
             socket.onerror = function(obj)//    
             {
            	 console.log("Socket  ");
             };
         }
         catch (ex) {
             log(ex);
        }
     }
     else{
        alert("       ,     Internet Explorer 10(0)  ");
     }
}

バックグラウンドコードはデータベースの変化を傍受し,変化がある場合はフロントにメッセージを送信し,フロントエンドは返された値に応じて対応する操作を行う.
	int m = userDao.insert(user);//       
	
				if(m>0) {
				//      ,webSocket              
					WebSocketServlet wss = new WebSocketServlet();
					try {
						wss.sendMessage();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

onMessageメソッド
 @OnMessage
public void onMessage(String msg,Session session) {    
	        try {
		    	sendMessage();
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	    }

sendMessage()メソッド
 public void sendMessage() throws IOException{
	        //    
	        for(WebSocketServlet item: webSocketSet){
	        //    :         ,       1,              1,           
	            item.session.getBasicRemote().sendText("1");
	        }
	    }

プロジェクト中に発生した問題と注意点
デッドサイクルはプロジェクトのデータ量が大きいため、データ更新時にredisキャッシュに格納し、ページ表示を行う必要があります.
  • フロントエンドonMessageメソッドの役割
  • socket.onmessage = function(event)
    {event.data==1}
    

    バックグラウンドwebsocketがメッセージを送信するかどうかを傍受するために使用される.この送信メッセージはバックグラウンドを呼び出すonMessageメソッドではなく、群発メッセージを呼び出すかどうかであり、群発メッセージの場合、フロントエンドのonMessageイベントがトリガーされ、サーバから送信されたこのデータ「1」を受信することができる.
     //    
    for(WebSocketServlet item: webSocketSet){
    	//    :         ,       1,              1,           
    	item.session.getBasicRemote().sendText("1");
    	  }
    

    フロントエンドの*socket.send()はメソッドのフロントエンドでバックエンドにメッセージを送信し、バックエンドのonMessageメソッドをトリガーすることができます.
    ここではデッドループフロントがメッセージを受信し、onMessageイベントをトリガし、トリガ後にsocketを呼び出すことに注意する.send()メソッド、このsocket.send()はバックグラウンドのonMessage()メソッドをトリガーし、バックグラウンドのonMessage()はsendMessage()を呼び出し、このメソッドのitem.session.getBasicRemote().sendText(“1”);フロントエンドのonMessageイベントをトリガーし、デッドサイクルに入ることができます
    フロントエンドコードとバックグラウンドコードの変更
    function websocket(){
        if ("WebSocket" in window){//         websocekt
            //var host = "ws://localhost/websocketindex/"//       Ip   
             var socket = new WebSocket(host);
             try {
                 socket.onopen = function()//  socekt
                 {
                	 console.log("WebSocket    ");
                 };
                 socket.onmessage = function(event)//  socekt
                 {
                	 console.log(event.data);
                	 **//    onMessage               ,   1,              ,       onMessage  ,socket.send(),       onMessage  **
             	    if(event.data=="1"){
             	        console.log("     ");
             	        socket.send("    ");
             	    }
             	   if(event.data=="2"){
     					console.log
       	     		}
                 };
                 socket.onclose = function()//  socekt  
                 {
                	 console.log("WebSocket    ");
                     socket.close();
                 };
                 socket.onerror = function(obj)//    
                 {
                	 console.log("Socket  ");
                 };
             }
             catch (ex) {
                 log(ex);
            }
         }
         else{
            alert("       ,     Internet Explorer 10(0)  ");
         }
    }
    

    バックグラウンドコードの変更
    データベースのリスニング
    	int m = userDao.insert(user);//       
    			if(m>0) {
    				//      ,webSocket              
    					WebSocketServlet wss = new WebSocketServlet();
    					try {
    						wss.sendMessage();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    
     @OnMessage
     public void onMessage(String msg,Session session) {    
    	    
    	        try {
    	        	saveRedis();//      redis
    		    	sendMessage2();
    	        } catch (IOException e) {
    	            // TODO Auto-generated catch block
    	            e.printStackTrace();
    	        }
    	    }
    

    2つのバックグラウンドがフロントエンドにメッセージを送信する方法を定義し、現在のエンドが2を受信すると、データキャッシュが成功したことを示し、バックグラウンドを要求し、まずredisから値を取得すればよい.
    	    public void sendMessage() throws IOException{
    	        //    
    	        for(WebSocketServlet item: webSocketSet){
    	            item.session.getBasicRemote().sendText("1");
    	        }
    	    }
    	    public void sendMessage2() throws IOException{
    	        //    
    	        for(WebSocketServlet item: webSocketSet){
    	            item.session.getBasicRemote().sendText("2");
    	        }
    	    }