ajax長連接
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,上面都有