webSocket心得

首先,本人對這個技術的研究深度並不是很深,所以下面都是一些基本的,比較淺顯的知識點而已,自己作爲學習記錄所用


1,首先說一下爲啥會有這個應用問題,學習javaweb有一段時間了,在接觸的過程中就遇到一個問題,就是一些操作我需要很頻繁的在服務器與頁面之間進行操作,之前問過一些人,他們也沒有給出很好的答案和做法,基本上都是兩點,一個是js中設置定時任務,每隔一段時間就像後臺發送請求,這樣導致整個項目的性能降低很多。另一個就是和原來的基本一樣,就是發起後讓他停着直到有符合要求的結果的時候再返回。但是這樣很不好,如果我的要求是實時數據不論什麼結果都要返回,不是就不可以了麼

2,webSocket的重大意義:解決了原來的web模式中服務器端的被動發送消息的缺陷。原來的web服務器都是客戶端發出請求,然後他再進行響應,沒法進行主動的消息推送,這主要也是和它原來是使用Http協議有關。現在的webSocket是基於TCP/IP協議進行運作的。基本的操作就是客戶端發出到服務器的請求,服務器與客戶端建立TCP連接,然後這個連接在不主動進行關閉操作時不會關閉。至此,服務器就可以向前端頁面進行數據推送,而不必向之前每次推送都進行連接建立,而且還獲得了主動性。總之:實現了高性能的由後端服務器到頁面的主動的數據推送。在實時性要求很高的應用環境中相當適用。

3,應用要求:Tomcat 7以上,瀏覽器則是谷歌或者火狐,具體的版本啥的各位百度吧,網上有,不過我沒有具體進行詳細的測試大笑關於版本

關於前端頁面部分發起tcp請求,所以這裏運用到HTML5的基本技術

而java後端則需要webSocket的API,這個API可以在Tomcat服務器中的lib(tomcat的jar包集合)中找到:webSocket-api.jar


4,下面是具體的代碼:


頁面:

<!DOCTYPE html>  
<html>  
<head>  
<title>Testing websockets</title>  
</head>  
<body>  
    <div>  
        <input type="submit" value="Start" οnclick="start()" />  
    </div>  
    <div id="messages"></div>  
    <script type="text/javascript">  
        var webSocket =  new WebSocket('ws://localhost:8090/SpringMVC1.0/websocket');  
  
        webSocket.onerror = function(event) {  
            onError(event);  
        };  
  
        webSocket.onopen = function(event) {  
            onOpen(event);  
        };  
  
        webSocket.onmessage = function(event) {  
            onMessage(event);  
        };  
  
        function onMessage(event) {  
            document.getElementById('messages').innerHTML   
                += '<br />' + event.data;  
        }  
  
        function onOpen(event) {  
            document.getElementById('messages').innerHTML   
                = 'Connection established';  
        }  
  
        function onError(event) {  
            alert(event.data);  
            alert("error");  
        }  
  
        function start() {  
            webSocket.send("ren-k");  
            return false;  
        }  
    </script>  
</body>  
</html>  

後臺:

package websocket;


import java.io.IOException;
import java.util.Iterator;
import java.util.List;


import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint(value="/webSocketQQ")
public class MnQQTest {  
  
public static List<String> sjStory;
    @OnMessage  
    public void onMessage(String message, Session session)   
        throws IOException, InterruptedException {  
          
    sjStory.add(message);
        int sentMessages = 0;  
        String mykey = message.split("-")[0];
        while(true){  
            Thread.sleep(200);
            
           Iterator<String> sjst = sjStory.iterator();
           while(sjst.hasNext()){
          String[] nr = sjst.next().split("-");
          if(!nr[0].equals(mykey)){
          session.getBasicRemote().sendText(nr[0]+":"+nr[1]);
          sjst.remove();
          }
           }
              
        }  
    }  
      
    @OnOpen  
    public void onOpen () {  
        System.out.println("Client connected");  
    }  
  
    @OnClose  
    public void onClose () {  
        System.out.println("Connection closed");  
    }  


5,操作總結

頁面

在頁面是基本操作包括:建立與後臺的TCP連接,發送數據

建立連接的主要操作是:var webSocket =  new WebSocket('ws://localhost:8090/SpringMVC1.0/webSocketQQ');

這就是在HTML5中建立TCP連接的方式,之後的發送操作什麼的全是通過webSocket對象操作即可,ws://即代表要建立長連接,後面則是後端服務器地址(處理對應操 作的contrller,就是後臺代碼而已)

還有就是發送用send方法即可,詳情參見代碼

後端(在這段代碼裏面家有註解,但是此處的類並沒有在web.xml中配置也沒有在框架中掃描,個人理解應該是凡是有ServerEndpoint註解的類在Tomcat7以上服務器中會自動進 行處理,讓其可以與頁面建立TCP連接)

這裏可能有很多的註解方法顧名思義,Onopen,Onclose即代表在創建和關閉連接時執行的方法,而主要的操作主要是在omMessage方法中進行,參數Message即爲前臺傳遞 的數據,session則是可以進行操作向前端主動推送數據

發送的具體代碼是:session.getBasicRemote().sendText();括號中即爲數據

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