当前位置:首页 » 网络连接 » 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