首先,本人對這個技術的研究深度並不是很深,所以下面都是一些基本的,比較淺顯的知識點而已,自己作爲學習記錄所用
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();括號中即爲數據