jsp長連接
① 如何干凈的實現Android/Java Socket 長連接通信
所謂長連接,它通常包含以下幾個關鍵過程:
輪詢的建立
建立輪詢的過程很簡單,瀏覽器發起請求後進入循環等待狀態,此時由於伺服器還未做出應答,所以HTTP也一直處於連接狀態中。
2. 數據的推送
在循環過程中,伺服器程序對數據變動進行監控,如發現更新,將該信息輸出給瀏覽器,隨即斷開連接,完成應答過程,實現「伺服器推」。
3. 輪詢的終止
輪詢可能在以下3種情況時終止:
3.1. 有新數據推送
當循環過程中伺服器向瀏覽器推送信息後,應該主動結束程序運行從而讓連接斷開,這樣瀏覽器才能及時收到數據。
3.2. 沒有新數據推送
循環不能一直持續下去,應該設定一個最長時限,避免WEB伺服器超時(Timeout),若一直沒有新信息,伺服器應主動向瀏覽器發送本次輪詢無新信息的正常響應,並斷開連接,這也被稱為「心跳」信息。
3.3. 網路故障或異常
由於網路故障等因素造成的請求超時或出錯也可能導致輪詢的意外中斷,此時瀏覽器將收到錯誤信息。
4. 輪詢的重建
瀏覽器收到回復並進行相應處理後,應馬上重新發起請求,開始一個新的輪詢周期。
客戶端代碼片段
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <%@ include file="/tags/jquery-lib.jsp"%> <script type="text/javascript"> $(function () { window.setInterval(function () { $.get("${pageContext.request.contextPath}/communication/user/ajax.mvc", {"timed": new Date().getTime()}, function (data) { $("#logs").append("[data: " + data + " ]<br/>"); }); }, 3000); }); </script> </head> <body> <div id="logs"></div> </body> </html>
伺服器端代碼
@RequestMapping("/ajax") public void ajax(long timed, HttpServletResponse response) throws Exception { PrintWriter writer = response.getWriter(); Random rand = new Random(); // 死循環 查詢有無數據變化 while (true) { Thread.sleep(300); // 休眠300毫秒,模擬處理業務等 int i = rand.nextInt(100); // 產生一個0-100之間的隨機數 if (i > 20 && i < 56) { // 如果隨機數在20-56之間就視為有效數據,模擬數據發生變化 long responseTime = System.currentTimeMillis(); // 返回數據信息,請求時間、返回數據時間、耗時 writer.print("result: " + i + ", response time: " + responseTime + ", request time: " + timed + ", use time: " + (responseTime - timed)); break; // 跳出循環,返回數據 } else { // 模擬沒有數據變化,將休眠 hold住連接 Thread.sleep(1300); } } }
② jsp如何接收java後台發過來的json,jsp沒有發任何請求,只接受後台的json
一般情況下,我們都是從前台請求後台數據--->前端請求後端。
你的意思我沒理解錯的話專就是想後端屬直接請求前端。這種需求一般是在做消息推送,聊天或站內信時會用到。
符合這個邏輯的有一種技術。叫DWR,DWR的反轉AJAX功能允許我們從伺服器端來控制客服端,而不需要客戶端的請求,伺服器可以自動把消息發給指定的客戶端。DWR的Push技術是讓伺服器每次發送廣播時,把這個廣播推送給客戶端,而不用客戶端去刷新,DWR的推送是基於長連接的,性能優越。
③ 為什麼php,jsp很少用於游戲服務端的開發
到底是「項目用什麼語言,取決於開發成員對語言的熟悉度,哪種語言熟版悉用哪種。游戲服務端的語言選權擇也是這樣。」還是「長連接和短連接在長時間游戲客戶端和游戲服務端頻繁交換數據上的優劣導致」還是其他原因導致php,jsp很少用於游戲服務端的開發?
短
連接就導致了某些游戲根本無法使用http協議進行通訊,這個「某些」中就包括了人民群眾喜聞樂見的arpg,因此導致了使用php和jsp進行伺服器開
發的團隊有著局限性。弱交互(棋牌類)游戲還是可以使用http 加 輪詢來實現。當然可能一輩子就只能做弱交互的了(大部分手游就是這樣)。
④ jsp,怎麼獲取客戶端離開某個jsp頁面或者servlet或者action,進入的時候到是好辦。
這個問題是需要寫一個大小為1的iframe,定時刷新,沒有內容但是伺服器可以根回據參數獲得所答在頁面,甚至其他用戶行為。
間隔越短越精確,耗費資源越多。
然後在離開頁面的時候有個事件,可以在這個事件中給伺服器發消息,告訴伺服器離開的目的地。
這個功能肯定不是用長連接的,不同的應用場合
⑤ jsp有沒有類似websocket的技術,但瀏覽器兼容性比websocket好;不要用單純的ajax
問題一:
jsp中沒有,webscoket是html5中的內容了。
兩種方式解決你想要做的程序:內
a、前台jsp或者html通過容js輪詢,發送ajax請求到後台。
b、通過http的長連接實現,具體可以參考dwr2中的伺服器推技術,下載dwr的demo其中就有示例代碼及說明。
⑥ tomcat獲得正在運行的socket長連接對象,
這個容易來 運行一個serverlit即可 不需要自tomcat直接與 C++ ServerSocket通訊 要知道 沒有推送到瀏覽器這一說 http協議決定了這一點 必須是瀏覽器觸發請求 http才可以建立 而且 更重要的是 http的長連接很不穩定 既然是瀏覽器的請求觸發那就好辦了, 不管是ajax還是普通的request 只需要對齊請求的serverlet或者jsp編碼即可 在jsp中直接使用java socket與C++serversocket通訊即可 將獲取的信息直接按照你的view格式寫入response 既穩定 又安全
⑦ 能不能在jsp中中創建個tcp長連接,連接單片機,網頁接收用戶通過瀏覽器發來的數據,通過tcp發送給單片機
兄弟,搞定了沒?如果伺服器那邊用的是TCPClient的我有,用TCPServer的正在研究,如果你搞定了,給我分享下,謝謝!
⑧ jsp是否可以和後端建立長連接
需要支持websocket的瀏覽器,或者採用其他長連接的js框架。
⑨ PHP中如何實現與伺服器的長連接呢 - PHP進階討論
在使用永久連接時還有一些特別的問題需要注意。例如在永久連接中使用數據表鎖內時,如果腳本不容管什麼原因無法釋放該數據表鎖,其隨後使用相同連接的腳本將會被永久的阻塞,使得需要重新啟動 httpd 服務或者資料庫服務。另外,在使用事務處理時,如果腳本在事務阻塞產生前結束,則該阻塞也會影響