反向Ajax之WebSocket
WebSocket是HTML5開始提供的一種瀏覽器與伺服器間進行全雙工通訊的網路技術。
反向Ajax在觀察者模型、聊天系統中應用的越來越多。如股票,監控等系統。
以聊天系統為例,如果沒有伺服器推的技術,Web聊天系統只能以固定的時間間隔輪詢伺服器。
這會產生大量的無用的連線,對伺服器造成巨大壓力。
在單位寫過一個IM聊天系統,在配置了執行緒池,記憶體快取等優化手段之後,通過loadrunner壓力測試,併發訪問量卻始終超不過200/s。在這種系統中,輪詢是一種噩夢。
WebSocket作為伺服器推(反向Ajax)的手段之一,可以解決這種需求。
下面的例子,簡單介紹了WebSocket的使用。
伺服器每隔3秒,將自身的記憶體資訊推送到所有連線的客戶端瀏覽器。如果客戶端瀏覽器點選按鈕,則立即對該客戶端返回最新的資訊。
頁面:
程式碼:
效果截圖:
但是在Tomcat 7.0.47版本中,WebSocketServlet已經標識為deprecated,並可能在Tomcat 8中remove。
是不是設計了更好的API
反向Ajax在觀察者模型、聊天系統中應用的越來越多。如股票,監控等系統。
以聊天系統為例,如果沒有伺服器推的技術,Web聊天系統只能以固定的時間間隔輪詢伺服器。
這會產生大量的無用的連線,對伺服器造成巨大壓力。
在單位寫過一個IM聊天系統,在配置了執行緒池,記憶體快取等優化手段之後,通過loadrunner壓力測試,併發訪問量卻始終超不過200/s。在這種系統中,輪詢是一種噩夢。
WebSocket作為伺服器推(反向Ajax)的手段之一,可以解決這種需求。
下面的例子,簡單介紹了WebSocket的使用。
伺服器每隔3秒,將自身的記憶體資訊推送到所有連線的客戶端瀏覽器。如果客戶端瀏覽器點選按鈕,則立即對該客戶端返回最新的資訊。
頁面:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
<title>WebSocket</title>
-
<script type="text/javascript"
-
src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
-
<script type="text/javascript">
-
var ws = null;
-
function startWebSocket() {
-
if ('WebSocket' in window) {
-
ws = new WebSocket('ws://127.0.0.1:8080/Web/ws.do');
-
} else if ('MozWebSocket' in window) {
-
ws = new MozWebSocket('ws://127.0.0.1:8080/Web/ws.do');
-
} else {
-
alert('瀏覽器不支援WebSocket');
-
}
-
-
ws.onmessage = function(evt) {
-
$('#content').html(evt.data);
-
}
-
-
ws.onclose = function(evt) {
-
$('#content').html('WebSocket關閉');
-
}
-
-
ws.onopen = function(evt) {
-
$('#content').html('WebSocket已經開啟');
-
}
-
}
-
-
function getJVMInfo() {
-
//隨便發點什麼
-
ws.send(new Date());
-
}
-
-
$(document).ready(function() {
-
startWebSocket();
-
});
-
</script>
-
</head>
-
<body>
-
<input type="button" value="立即獲取" onclick="getJVMInfo();" />
-
<div id="content"></div>
-
</body>
- </html>
-
import java.io.IOException;
-
import java.net.URLDecoder;
-
import java.net.URLEncoder;
-
import java.nio.ByteBuffer;
-
import java.nio.CharBuffer;
-
import java.text.SimpleDateFormat;
-
import java.util.Date;
-
import java.util.List;
-
import java.util.concurrent.CopyOnWriteArrayList;
-
import java.util.concurrent.Executors;
-
import java.util.concurrent.ScheduledExecutorService;
-
import java.util.concurrent.TimeUnit;
-
-
import javax.servlet.ServletException;
-
import javax.servlet.annotation.WebServlet;
-
import javax.servlet.http.HttpServlet;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
-
import org.apache.catalina.websocket.MessageInbound;
-
import org.apache.catalina.websocket.StreamInbound;
-
import org.apache.catalina.websocket.WebSocketServlet;
-
import org.apache.catalina.websocket.WsOutbound;
-
-
/**
-
* Servlet implementation class InitServlet
-
*/
-
@WebServlet("/ws.do")
-
public class InitServlet extends WebSocketServlet implements Runnable {
-
List<JVMMessageInbound> list = new CopyOnWriteArrayList<JVMMessageInbound>();
-
ScheduledExecutorService singleThread = Executors.newSingleThreadScheduledExecutor();
-
{
-
singleThread.scheduleWithFixedDelay(this, 3, 3, TimeUnit.SECONDS);
-
}
-
-
@Override
-
protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) {
-
return new JVMMessageInbound();
-
}
-
-
private class JVMMessageInbound extends MessageInbound {
-
-
@Override
-
protected void onBinaryMessage(ByteBuffer arg0) throws IOException {
-
}
-
-
@Override
-
protected void onTextMessage(CharBuffer arg0) throws IOException {
-
CharBuffer cb = CharBuffer.wrap(arg0);
-
String data = cb.toString();
-
System.out.println(data);
-
this.getWsOutbound().writeTextMessage(CharBuffer.wrap(getJVMInfo()));
-
this.getWsOutbound().flush();
-
}
-
-
@Override
-
protected void onClose(int status) {
-
System.out.println("Close WebSocket");
-
super.onClose(status);
-
list.remove(this);
-
}
-
-
@Override
-
protected void onOpen(WsOutbound outbound) {
-
System.out.println("Open new WebSocket");
-
super.onOpen(outbound);
-
list.add(this);
-
}
-
-
}
-
-
private String getJVMInfo() {
-
long useMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
-
useMemory = useMemory / 1024;
-
return "已用記憶體:" + String.valueOf(useMemory) + "K";
-
}
-
-
@Override
-
public void run() {
-
System.out.println("傳送廣播通知");
-
String data = "廣播通知\n" + new Date() + "\n" + getJVMInfo();
-
for (JVMMessageInbound m : list) {
-
try {
-
m.getWsOutbound().writeTextMessage(CharBuffer.wrap(data));
-
m.getWsOutbound().flush();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
- }
但是在Tomcat 7.0.47版本中,WebSocketServlet已經標識為deprecated,並可能在Tomcat 8中remove。
是不是設計了更好的API
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1064838/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 反向ajax
- Nginx支援WebSocket反向代理-學習小結NginxWeb
- 採用nginx反向代理讓websocket 支援 wssNginxWeb
- JS 中的網路請求 AJAX, Fetch, WebSocketJSWeb
- 前端之AJAX前端
- JavaScript 之 ajaxJavaScript
- 關於Ajax和websocket的區別以及使用場景!Web
- 使用 Apache 反向代理來配置 Laravel-Websocket SSL(WSS 連線)ApacheLaravelWeb
- web系列之AjaxWeb
- oracle之 反向鍵索引Oracle索引
- 淺談Nginx之反向代理Nginx
- Flask之ajax操作示例Flask
- BeetleX之WebSocket詳解Web
- ## 前端面試之websocket前端面試Web
- nginx大道至簡之反向代理Nginx
- nginx 學習之反向代理(1)Nginx
- Ajax 之檔案上傳
- Django基礎五之AjaxDjango
- 雙向通訊之websocketWeb
- 帶你入門RPC之反向代理RPC
- rxjs入門之ajax封裝JS封裝
- SpringMVC之ajax非同步互動SpringMVC非同步
- 《菜農升職記》之 WebsocketWeb
- SpringCloud之配置WebSocket的最佳方式SpringGCCloudWeb
- HTML5 新特性之 WebsocketHTMLWeb
- 楊老師課堂之Nginx學習之反向代理Nginx
- Docker Compose例項之nginx反向代理GitLabDockerNginxGitlab
- 前端 JS 之 AJAX 簡介及使用前端JS
- Nginx專題(1):Nginx之反向代理及配置Nginx
- Nginx之location中反向代理proxy_pass配置Nginx
- Django之基於iframe的ajax偽造Django
- 前後端分離之Ajax入門後端
- ajax跨域請求之CORS的使用跨域CORS
- Ajax 之戰:XMLHttpRequest與Fetch API比較XMLHTTPAPI
- Tcp, WebSocket 和 http 之間的通訊TCPWebHTTP
- JavaScript 伺服器推送技術之 WebSocketJavaScript伺服器Web
- netty系列之:分離websocket處理器NettyWeb
- AJAX、$.ajax、axios、fetch、superagentiOS
- Ajax 什麼是Ajax? Ajax的基本語法