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,上面都有