JAVA實現websocket
阿新 • • 發佈:2018-12-15
什麼是websocket?
傳統的通訊模式是這樣的:客戶端(瀏覽器等)主動向伺服器傳送一個請求,伺服器接收之後,處理這個請求,然後返回一個響應給客戶端。大多數都是客戶端向伺服器傳送請求,而伺服器很難主動向客戶端傳送資料。
websocket實現了瀏覽器與伺服器的全雙工通訊,使服務端也能主動向客戶端傳送資料。
websocket工作流程是這樣的:客戶端向伺服器發出建立websocket連線的請求,在websocket連線建立之後,客戶端和服務端就可以通過TCP連線傳輸資料。
如果在tomcat上部署的話,需要保證版本在Tomcat7.0.47以上。
- index.jsp
<script type="text/javascript" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
$(function(){
var websocket = null;
//判斷瀏覽器是否支援websocket
if('WebSocket' in window) {
//如果支援,建立websocket物件,注意url格式
websocket = new WebSocket('ws://localhost:8080/zhouchenxuan/go' );
}else {
alert('瀏覽器版本不支援websocket!');
}
//定義連線錯誤的回撥方法
websocket.onerror = function() {
alert('websocket連接出錯!');
}
//定義連線成功的回撥方法
websocket.onopen = function() {
alert('websocket連線成功!');
}
//定義websocket關閉的回撥方法
websocket.onclose = function() {
alert('websocket已關閉!')
}
//當視窗關閉時,主動去關閉websocket連線
window.onbeforeunload = function() {
closeWebSocket();
}
//接收到訊息的回撥方法
websocket.onmessage = function(event) {
handleMsg(event.data);
}
$('#send').click(function() {
websocket.send($('#input').val());
});
});
//關閉websocket
function closeWebSocket() {
websocket.close();
}
function handleMsg(msg) {
$('#msg').append(msg + '\n');
}
</script>
<body>
<input name="input" id="input" type="text" /> <input name="send" id="send" type="button" value="傳送請求" />
<br><hr style="width:50%;" align="left">
<textarea name="msg" id="msg" style="width: 260px;height:190px"></textarea>
</body>
- Test.java
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
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;
/**
* 將目前的類定義成一個websocket伺服器端
*/
@ServerEndpoint("/go")
public class Test {
//concurrent包的執行緒安全Set,用來存放每個客戶端對應的Test物件。
private static CopyOnWriteArraySet<Test> set = new CopyOnWriteArraySet<Test>();
//與某個客戶端的連線會話,需要通過它來給客戶端傳送資料
private Session session;
/**
* 連線建立成功呼叫的方法
* @param session
*/
@OnOpen
public void OnOpen(Session session) {
this.session = session;
set.add(this);
System.out.println("OnOpen()方法被執行...");
System.out.println("websocket連線建立成功...");
System.out.println();
}
/**
* 連線關閉的方法
*/
@OnClose
public void OnClose() {
set.remove(this);
System.out.println("OnClose()方法被執行...");
System.out.println("websocket連線已經關閉...");
System.out.println();
}
/**
* 接收訊息的方法
* @param msg
* @param session
*/
@OnMessage
public void OnMessage(String msg, Session session) {
System.out.println("已從客戶端接收訊息:" + msg);
//可以做一些複雜邏輯,這裡每秒中傳送一條資料
for(int i = 0;i < 10;i++) {
try {
Thread.currentThread().sleep(1000);
//向所有客戶端發訊息
for(Test t : set) {
t.sendResponse("這是第" + (i + 1) + "條資訊...");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("向客戶端傳送資料完畢...");
}
/**
* 出錯的方法,注意引數不能錯
* @param session
* @param error
*/
@OnError
public void OnError(Session session, Throwable error) {
System.out.println("OnError()方法被執行...");
System.out.println("websocket出錯...");
System.out.println();
}
//傳送資料到客戶端,這個沒有註解
public void sendResponse(String str) {
try {
System.out.println("sendResponse()方法被執行...");
this.session.getBasicRemote().sendText(str);
} catch (IOException e) {
e.printStackTrace();
}
}
}
程式碼複製完了,我們開啟瀏覽器跑一下試試。。。
進入到測試頁面,會提示“連線成功…”
輸入一些資訊,然後點選“傳送請求”,後臺就會接收資訊,也會把伺服器的資訊傳送到瀏覽器。