Http长连接的例子_亲测可用哦
生活随笔
收集整理的這篇文章主要介紹了
Http长连接的例子_亲测可用哦
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么事Http長連接:在網上有很多很多關于Http長連接的文章,但是我看了很多都看不懂。自己總結的所謂的http長連接就是在一請求一個頁面后,在服務器端不斷開http連接,而是通過response一直在定時的往頁面客戶端刷新數據。
二、servlet編寫
package servlet;import java.io.IOException; import java.text.SimpleDateFormat; import java.util.concurrent.TimeUnit;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;Long currTime = null;SimpleDateFormat sdf = null;public void init() throws ServletException {// 初始化一些參數super.init();currTime = System.currentTimeMillis();sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 在get中直接調用doPost方法doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 長連接方式boolean flag = true;// 用來表示長連接是否已經被斷開(如果數據發送失敗了就說明是斷開了)while (true) {flag = this.sendData("jsFun", sdf.format(currTime), response);currTime = System.currentTimeMillis();if (!flag) {// 如果數據發送失敗,那么就退出了,說明頁面長連接已經斷開了break;}try {// 每5秒發送一次TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}}}/*** @Title: sendData* @Description: 用來定時向客戶端返回數據* @param jsFun要調用的js函數* @param data要發送的數據* @param response*/private boolean sendData(String jsFun, String data,HttpServletResponse response) {try {response.setContentType("text/html;charset=utf-8");/* 這句話比較重要,我們通過response給頁面返回一個js腳本,讓js執行父頁面的對應的jsFun,參數就是我們的data */response.getWriter().write("<script type=\"text/javascript\">parent." + jsFun + "(\""+ data + "\")</script>");response.flushBuffer();return true;} catch (Exception e) {System.err.println("long connection was broken!");return false;}}}三、頁面編寫
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script type="text/javascript"src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script> <title>測試頁面</title> </head> <body><!-- 定義一個form表單, 重要的是target="myiframe",這里把form的請求定向到了myiframe中,然后再myiframe中執行servlet中返回的腳本,調用myiframe的父頁面的jsFun,也就是本頁面的jsFun --><form action="" method="post" id="myForm" target="myiframe"></form><!-- iframe要隱藏哦 --><iframe id="myiframe" name="myiframe" style="display: none;"></iframe><div id="container" style="height: 800px"></div></body><script type="text/javascript">function jsFun(data) {//一直被后臺調用的方法$('#container').append("<br/>");$('#container').append(data);}function init() {//用戶進入頁面后就自動發起form表單的提交,激活長連接var action = "${pageContext.request.contextPath}/servlet/TestServlet";$('#myForm').attr("action", action);$('#myForm').submit();} </script><script type="text/javascript">$(function() {init();}); </script> </html>
可以看到數據是每隔5條打印一次的,而且瀏覽器的頁面一直在轉圈圈,這就是http長連接的標志。
五、當頁面斷開連接的時候(刷新頁面或關閉頁面)
可以看到服務器會自動斷開連接,避免資源的浪費。
總結
以上是生活随笔為你收集整理的Http长连接的例子_亲测可用哦的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决定好好研究一些开源的系统
- 下一篇: installshield安装文件的制作