當前位置:首頁 » 網路連接 » ajax長連接

ajax長連接

發布時間: 2021-03-01 23:11:45

1. ajax長輪詢

一般最原始的作法就是在客戶端搞個定時器一直向後台請求,而ajax的長輪詢專與一般的http連接不屬一樣,它發送的是長連接,比如說你發過去一個連接,它並不急於給你返回過來請求,而是等到後台有動作的時候才有相應,這樣就減少了客戶端的壓力,現在很多地方都用到這種技術,比如說網路,新浪微博,比較成熟的框架有pushlet,另外servlet3.0也增加了非同步的功能,也能很好的解決這個問題,HTML5在將來,這個問題就更簡單了!如果你要研究,建議你深入的了解一下HTTP協議的內部工作原理,了解一下伺服器的實現,希望能幫到你。

2. ajax長連接實在不能理解,,求解惑

找這個文章

利用Ajax實現長連接(模擬推送)

很多程序都可以通過socket來實現長連接,內實現消息的即容時推送。但由於http請求一般都是短連接,一次請求結束,就會斷開與伺服器的連接,伺服器不能主動推送數據到客戶端,而只能由客戶端發起請求,但有些時候,需要在web上實現即時的消息傳輸,比如即時聊天、股票動態信息等。
在 Ajax技術被發掘以前,在網頁上實現無刷新的即時聊天,似乎是很困難的事情,但由於Ajax技術的興起,人們可以進一步來挖掘它的潛力了,象 gmail、google gtalk的網頁版,都是Ajax長連接的重要應用,目前很多網站可能都已經在使用長連接技術了,比如SNS網站的即時聊天。

3. dwr的反轉ajax是長鏈接嗎

dwr的ajax反轉有三種匹配模式;
可能採用的是默認的匹配模式paggyback;
不是comment模式是;只有comment模式才會建立長連接,及時更新請求。

4. HttpWebRequest怎麼長連接

HTTP是無狀態的
也就是說,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端瀏覽器訪問的某個HTML或其他類型的 Web頁中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話
HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。
如果瀏覽器或者伺服器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。
所謂長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差,
所謂短連接指建立SOCKET連接後發送後接收完數據後馬上斷開連接,一般銀行都使用短連接
短連接:比如
http
的,只是連接、請求、關閉,過程時間較短
,
伺服器若是一段時間內沒有收到請求即可關
閉連接。

長連接:有些服務需要長時間連接到伺服器,比如
CMPP
,一般需要自己做在線維持。

最近在看

伺服器推送技術

,在
B/S
結構中,通過某種
magic
使得客戶端不需要通過輪詢即可以得到服務
端的最新信息(比如股票價格)
,這樣可

以節省大量的帶寬。

傳統的輪詢技術對伺服器的壓力很大,
並且造成帶寬的極大浪費。如果改用
ajax
輪詢,可以降低帶寬的負荷
(因為伺服器返回的不是完整頁面)

但是對伺服器

的壓力並不會有明顯的減少。

而推技術(
push
)可以改善這種情況。但因為
HTTP
連接
的特性(短暫,必須由客戶端發起)
,使得推技術的實現比較困難,常見的做法是通過延長
http
連接的壽


來實現
push


接下來自然該討論如何延長
http
連接的壽命

最簡單的自然是死循環法



servlet






public
void
doGet(Request
req,
Response
res)
{
PrintWriter
out
=
res.getWriter();
……








……

5. 如何用java實現HTTP長連接

後台接收到請求以後不馬上返回,而是隔一段時間再返回

6. java如何實現http長連接

通過輪詢來實現長連接
輪詢:隔一段時間訪問伺服器,伺服器不管有沒有新消息都立刻返回。
http長連接實現代碼:
客戶端:
package houlei.csdn.keepalive;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentHashMap;

/**
* C/S架構的客戶端對象,持有該對象,可以隨時向服務端發送消息。
* <p>
* 創建時間:2010-7-18 上午12:17:25
* @author HouLei
* @since 1.0
*/
public class Client {

/**
* 處理服務端發回的對象,可實現該介面。
*/
public static interface ObjectAction{
void doAction(Object obj,Client client);
}
public static final class DefaultObjectAction implements ObjectAction{
public void doAction(Object obj,Client client) {
System.out.println("處理:\t"+obj.toString());//診斷程序是否正常
}
}
public static void main(String[] args) throws UnknownHostException, IOException {
String serverIp = "127.0.0.1";
int port = 65432;
Client client = new Client(serverIp,port);
client.start();
}

private String serverIp;
private int port;
private Socket socket;
private boolean running=false;
private long lastSendTime;
private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();

public Client(String serverIp, int port) {
this.serverIp=serverIp;this.port=port;
}

public void start() throws UnknownHostException, IOException {
if(running)return;
socket = new Socket(serverIp,port);
System.out.println("本地:"+socket.getLocalPort());
lastSendTime=System.currentTimeMillis();
running=true;
new Thread(new KeepAliveWatchDog()).start();
new Thread(new ReceiveWatchDog()).start();
}

public void stop(){
if(running)running=false;
}

/**
* 添加接收對象的處理對象。
* @param cls 待處理的對象,其所屬的類。
* @param action 處理過程對象。
*/
public void addActionMap(Class<Object> cls,ObjectAction action){
actionMapping.put(cls, action);
}

public void sendObject(Object obj) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(obj);
System.out.println("發送:\t"+obj);
oos.flush();
}

class KeepAliveWatchDog implements Runnable{
long checkDelay = 10;
long keepAliveDelay = 2000;
public void run() {
while(running){
if(System.currentTimeMillis()-lastSendTime>keepAliveDelay){
try {
Client.this.sendObject(new KeepAlive());
} catch (IOException e) {
e.printStackTrace();
Client.this.stop();
}
lastSendTime = System.currentTimeMillis();
}else{
try {
Thread.sleep(checkDelay);
} catch (InterruptedException e) {
e.printStackTrace();
Client.this.stop();
}
}
}
}
}

class ReceiveWatchDog implements Runnable{
public void run() {
while(running){
try {
InputStream in = socket.getInputStream();
if(in.available()>0){
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();
System.out.println("接收:\t"+obj);//接受數據
ObjectAction oa = actionMapping.get(obj.getClass());
oa = oa==null?new DefaultObjectAction():oa;
oa.doAction(obj, Client.this);
}else{
Thread.sleep(10);
}
} catch (Exception e) {
e.printStackTrace();
Client.this.stop();
}
}
}
}

}
服務端:
package houlei.csdn.keepalive;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;

/**
* C/S架構的服務端對象。
* <p>
* 創建時間:2010-7-18 上午12:17:37
* @author HouLei
* @since 1.0
*/
public class Server {

/**
* 要處理客戶端發來的對象,並返回一個對象,可實現該介面。
*/
public interface ObjectAction{
Object doAction(Object rev);
}

public static final class DefaultObjectAction implements ObjectAction{
public Object doAction(Object rev) {
System.out.println("處理並返回:"+rev);//確認長連接狀況
return rev;
}
}

public static void main(String[] args) {
int port = 65432;
Server server = new Server(port);
server.start();
}

private int port;
private volatile boolean running=false;
private long receiveTimeDelay=3000;
private ConcurrentHashMap<Class, ObjectAction> actionMapping = new ConcurrentHashMap<Class,ObjectAction>();
private Thread connWatchDog;

public Server(int port) {
this.port = port;
}

public void start(){
if(running)return;
running=true;
connWatchDog = new Thread(new ConnWatchDog());
connWatchDog.start();
}

@SuppressWarnings("deprecation")
public void stop(){
if(running)running=false;
if(connWatchDog!=null)connWatchDog.stop();
}

public void addActionMap(Class<Object> cls,ObjectAction action){
actionMapping.put(cls, action);
}

class ConnWatchDog implements Runnable{
public void run(){
try {
ServerSocket ss = new ServerSocket(port,5);
while(running){
Socket s = ss.accept();
new Thread(new SocketAction(s)).start();
}
} catch (IOException e) {
e.printStackTrace();
Server.this.stop();
}

}
}

class SocketAction implements Runnable{
Socket s;
boolean run=true;
long lastReceiveTime = System.currentTimeMillis();
public SocketAction(Socket s) {
this.s = s;
}
public void run() {
while(running && run){
if(System.currentTimeMillis()-lastReceiveTime>receiveTimeDelay){
overThis();
}else{
try {
InputStream in = s.getInputStream();
if(in.available()>0){
ObjectInputStream ois = new ObjectInputStream(in);
Object obj = ois.readObject();
lastReceiveTime = System.currentTimeMillis();
System.out.println("接收:\t"+obj);
ObjectAction oa = actionMapping.get(obj.getClass());
oa = oa==null?new DefaultObjectAction():oa;
Object out = oa.doAction(obj);
if(out!=null){
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(out);
oos.flush();
}
}else{
Thread.sleep(10);
}
} catch (Exception e) {
e.printStackTrace();
overThis();
}
}
}
}

private void overThis() {
if(run)run=false;
if(s!=null){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("關閉:"+s.getRemoteSocketAddress());//關閉長連接
}

}

}
長連接的維持,是要客戶端程序,定時向服務端程序,發送一個維持連接包的。
如果,長時間未發送維持連接包,服務端程序將斷開連接。

7. 請教JAVA如何實現web下的長連接關鍵後台如何寫

目前web上的消息通訊方式主要有以下幾種。
輪詢,長連接,websocket
輪詢:隔一段時間訪問伺服器,專伺服器不屬管有沒有新消息都立刻返回。
長連接:頁面向伺服器發出請求,由伺服器決定什麼時候返回。(如果有新消息則立刻返回,沒有的話就保持連接,直到有新消息才返回)
websocket:類似Java Socket,由Http請求模擬實現的socket。

要實現長連接的關鍵就是: 由伺服器端決定什麼時候返回數據。比如在servlet中。

doGet(...){
...
Thread.sleep(30000);
return ...
}
這就是一個長連接的例子,只是沒有任何意義而已。

你要做的就是在doGet中阻塞住,
while(!hasNewMsg){
sleep(500)
}
return newMsg...

當然你的ajax超時時間要設置長一點。

如果可以的話,最好可以使用websocket。

8. 長連接與長輪詢分別如何實現的各有哪些優勢和劣勢

comet有兩種形式 長輪詢和長連接 長連接的話: 服務端Servlet不close response,循環查找是否有數據是否要推送到客戶端 客戶端連接到客戶端之後,單獨有線程接收Servlet推送的數據,實現非同步接收,可以用jquery實現,或者自己寫javascript也可以 使用XMLHTTP 方式如下:try{XMLHttpReq_get = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {try{XMLHttpReq_get = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e){try{XMLHttpReq_get = new XMLHttpRequest(); } catch(e) { XMLHttpReq_get = false; alert("不能創建XMLHttpRequest對象"); return false;}}}XMLHttpReq_get.onreadystatechange = processRequest;// servlet推送數據的時候,客戶端觸發processRequest這個方法 XMLHttpReq_get.open("這個地方寫methode名稱,Get or Post", "Servlet URI", true); XMLHttpReq_get.send(null); //建立連接 function processRequest(){ if(XMLHttpReq_get.readyState == 4){//判斷對象狀態 這個表示長連接斷了 服務端的response被close 或者servlet處理線程結束 if(XMLHttpReq_get.status == 200){//信息已經成功返回,開始處理信息// TODO} else {//頁面不正常 alert("您所請求的頁面有異常");}}if(XMLHttpReq_get.readyState == 3){//判斷對象狀態 有數據傳回,連接沒斷,servlet flush數據回來 if(XMLHttpReq_get.status == 200){// TODO} else {//頁面不正常 alert("您所請求的頁面有異常");}}} 以前是我做的一個聊天室的部分代碼(有修改) 留了大致一個邏輯給你看看 有ajax的話 可以不這么做

9. http 協議 長連接 和連接的 區別

HTTP是無狀態的
也就是說,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連接,但任務結束就中斷連接。如果客戶端瀏覽器訪問的某個HTML或其他類型的 Web頁中包含有其他的Web資源,如JavaScript文件、圖像文件、CSS文件等;當瀏覽器每遇到這樣一個Web資源,就會建立一個HTTP會話
HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連接支持(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。
如果瀏覽器或者伺服器在其頭信息加入了這行代碼
Connection:keep-alive
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了帶寬。
實現長連接要客戶端和服務端都支持長連接。
所謂長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差,
所謂短連接指建立SOCKET連接後發送後接收完數據後馬上斷開連接,一般銀行都使用短連接
短連接:比如
http
的,只是連接、請求、關閉,過程時間較短
,
伺服器若是一段時間內沒有收到請求即可關
閉連接。

長連接:有些服務需要長時間連接到伺服器,比如
CMPP
,一般需要自己做在線維持。

最近在看

伺服器推送技術

,在
B/S
結構中,通過某種
magic
使得客戶端不需要通過輪詢即可以得到服務
端的最新信息(比如股票價格)
,這樣可

以節省大量的帶寬。

傳統的輪詢技術對伺服器的壓力很大,
並且造成帶寬的極大浪費。如果改用
ajax
輪詢,可以降低帶寬的負荷
(因為伺服器返回的不是完整頁面)

但是對伺服器

的壓力並不會有明顯的減少。

而推技術(
push
)可以改善這種情況。但因為
HTTP
連接
的特性(短暫,必須由客戶端發起)
,使得推技術的實現比較困難,常見的做法是通過延長
http
連接的壽


來實現
push


接下來自然該討論如何延長
http
連接的壽命

最簡單的自然是死循環法



servlet






public
void
doGet(Request
req,
Response
res)
{
PrintWriter
out
=
res.getWriter();
……








……

out.flush();
while
(true)
{
out.print("







");
out.flush();
Thread.sleep(3000);
}
}
如果使用觀察者模式則可以進一
步提高性能。

但是這種做法的缺點在於客戶端請求了這個
servlet
後,
web
伺服器會開啟一個線程執行
servlet
的代碼,而
servlet
由遲遲不肯結束,造成

該線程也無法被釋放。於是乎,一個客戶端一個線程,
當客戶端數量增加時,伺服器依然會承受很大的負擔。

要從根本上改變這個現象比較復雜,目前的趨
勢是從
web
伺服器內部入手,用
nio

JDK
1.4
提出的
java.nio
包)改寫
request/response
的實現,再利
用線程池增強伺服器的資源利用率,從而解決這個問題,目前支持這一非

J2EE
官方技術的伺服器有
Glassfish

Jetty
(後者只是聽說,沒有用過)

10. ajax長連接怎麼寫

$.ajax({
url:"請求方法地址"
data:{"參數一","參數二","參數三"},
dataType:"方法的返回值類型", //一般text,返回string類型,json,返回json類型
eeror:function(){ //請求失敗操作,一般alert("出錯了"),或者其他
},
success:function(data){ //data時返回值,function可以對data處理
if(data==『xxxxxx「){
}else{
}
}
})
其他還有一些不常用的參數你可以看w3c,上面都有

熱點內容
網卡了的原因 發布:2021-03-16 21:18:20 瀏覽:602
聯通客服工作怎麼樣 發布:2021-03-16 21:17:49 瀏覽:218
路由器畫圖 發布:2021-03-16 21:17:21 瀏覽:403
大網卡收費 發布:2021-03-16 21:16:50 瀏覽:113
路由器免費送 發布:2021-03-16 21:16:19 瀏覽:985
孝昌營業廳 發布:2021-03-16 21:15:54 瀏覽:861
網速增速代碼 發布:2021-03-16 21:15:29 瀏覽:194
怎麼黑光纖 發布:2021-03-16 21:14:54 瀏覽:901
埠增大 發布:2021-03-16 21:14:20 瀏覽:709
開機沒信號是什麼原因 發布:2021-03-16 21:13:45 瀏覽:645