persona5 攻略女生:基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 19:21:25
这里只是做个测试,很简单,没有做好线程同步的问题,只是为了长轮询。原理:可以看:http://yiminghe.javaeye.com/blog/294781AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于: 服务器端会阻塞请求直到有数据传递或超时才返回。
客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
聊天页面的代码:view plaincopy to clipboardprint?
<%@ page language="java" pageEncoding="GBK"%>
chat room
src="ext-2.2/build/locale/ext-lang-zh_CN.js">
username:
message:
<%@ page language="java" pageEncoding="GBK"%>
chat room
src="ext-2.2/build/locale/ext-lang-zh_CN.js">
username:
message:
定义mm.js,定义发送消息,定义接收消息的JS函数view plaincopy to clipboardprint?
Ext.onReady(function () {
getMsg();
});
function getMsg() {
Ext.Ajax.request({url:"getMsg", callback:function (options, success, response) {
if (success) {
Ext.DomHelper.append(Ext.get("main"), response.responseText, true);
}
getMsg();
}});
}
function putMsg() {
Ext.Ajax.request({url:"putMsg", params:{message:document.getElementById("message").value}});
}
/*
Ext.Updater.defaults.indicatorText='
var updater = Ext.get('main').getUpdater();
updater.update({
url:"getMsg"
});
*/
Ext.onReady(function () {
getMsg();
});
function getMsg() {
Ext.Ajax.request({url:"getMsg", callback:function (options, success, response) {
if (success) {
Ext.DomHelper.append(Ext.get("main"), response.responseText, true);
}
getMsg();
}});
}
function putMsg() {
Ext.Ajax.request({url:"putMsg", params:{message:document.getElementById("message").value}});
}
/*
Ext.Updater.defaults.indicatorText='
var updater = Ext.get('main').getUpdater();
updater.update({
url:"getMsg"
});
*/ 下面是获得message的servletview plaincopy to clipboardprint?
package hyjc.listener;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetMsg extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
MessageList m = MessageList.getInstance();
boolean end = false;
while (!end) {
System.out.println("before get");
String msg = m.get();
System.out.println("after get " + msg);
out.write(msg + "
");
if (m.isEmpty()) {
end = true;
}
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package hyjc.listener;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class GetMsg extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
MessageList m = MessageList.getInstance();
boolean end = false;
while (!end) {
System.out.println("before get");
String msg = m.get();
System.out.println("after get " + msg);
out.write(msg + "
");
if (m.isEmpty()) {
end = true;
}
}
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}
下面是添加消息的servletview plaincopy to clipboardprint?
package hyjc.listener;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PutMsg extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
System.out.println("put message");
PrintWriter out = response.getWriter();
out.flush();
String msg = request.getParameter("message");
if (null != msg) {
MessageList.getInstance().add(msg);
} else {
System.out.println("添加消息:" + msg + "成果");
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package hyjc.listener;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PutMsg extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
System.out.println("put message");
PrintWriter out = response.getWriter();
out.flush();
String msg = request.getParameter("message");
if (null != msg) {
MessageList.getInstance().add(msg);
} else {
System.out.println("添加消息:" + msg + "成果");
}
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}
下面是存放消息的消息队列,内部用阻塞队列使用view plaincopy to clipboardprint?
package hyjc.listener;
import java.util.Iterator;
import java.util.concurrent.LinkedBlockingQueue;
public class MessageList {
private static MessageList list = null;
private static Object key = new Object();
private MessageList() {
this.add("hello");
this.add("world");
}
public static MessageList getInstance() {
synchronized (key) {
if (list == null) {
list = new MessageList();
}
return list;
}
}
private LinkedBlockingQueue queue = new LinkedBlockingQueue();
public boolean isEmpty() {
return queue.isEmpty();
}
public int size() {
return queue.size();
}
public String get() {
try {
return queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public void clear() {
queue.clear();
}
public void add(String msg) {
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public Iterator iterator() {
return queue.iterator();
}
}
package hyjc.listener;import java.util.Iterator;
import java.util.concurrent.LinkedBlockingQueue;public class MessageList { private static MessageList list = null; private static Object key = new Object(); private MessageList() {
this.add("hello");
this.add("world");
} public static MessageList getInstance() {
synchronized (key) {
if (list == null) {
list = new MessageList();
}
return list;
}
} private LinkedBlockingQueue queue = new LinkedBlockingQueue(); public boolean isEmpty() {
return queue.isEmpty();
} public int size() {
return queue.size();
} public String get() {
try {
return queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
} public void clear() {
queue.clear();
} public void add(String msg) {
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public Iterator iterator() {
return queue.iterator();
}
}
下面是演示效果,输入message,点击submit,就会添加到MessageList中,然后会在GetMsg中继续执行,实现长连接 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/30/4140903.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/30/4140903.aspx
客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
聊天页面的代码:view plaincopy to clipboardprint?
<%@ page language="java" pageEncoding="GBK"%>
username:
message:
<%@ page language="java" pageEncoding="GBK"%>
username:
message:
定义mm.js,定义发送消息,定义接收消息的JS函数view plaincopy to clipboardprint?
Ext.onReady(function () {
getMsg();
});
function getMsg() {
Ext.Ajax.request({url:"getMsg", callback:function (options, success, response) {
if (success) {
Ext.DomHelper.append(Ext.get("main"), response.responseText, true);
}
getMsg();
}});
}
function putMsg() {
Ext.Ajax.request({url:"putMsg", params:{message:document.getElementById("message").value}});
}
/*
Ext.Updater.defaults.indicatorText='
refresh...
'; var updater = Ext.get('main').getUpdater();
updater.update({
url:"getMsg"
});
*/
Ext.onReady(function () {
getMsg();
});
function getMsg() {
Ext.Ajax.request({url:"getMsg", callback:function (options, success, response) {
if (success) {
Ext.DomHelper.append(Ext.get("main"), response.responseText, true);
}
getMsg();
}});
}
function putMsg() {
Ext.Ajax.request({url:"putMsg", params:{message:document.getElementById("message").value}});
}
/*
Ext.Updater.defaults.indicatorText='
refresh...
';var updater = Ext.get('main').getUpdater();
updater.update({
url:"getMsg"
});
*/ 下面是获得message的servletview plaincopy to clipboardprint?
package hyjc.listener;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetMsg extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
MessageList m = MessageList.getInstance();
boolean end = false;
while (!end) {
System.out.println("before get");
String msg = m.get();
System.out.println("after get " + msg);
out.write(msg + "
");
if (m.isEmpty()) {
end = true;
}
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package hyjc.listener;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class GetMsg extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
MessageList m = MessageList.getInstance();
boolean end = false;
while (!end) {
System.out.println("before get");
String msg = m.get();
System.out.println("after get " + msg);
out.write(msg + "
");
if (m.isEmpty()) {
end = true;
}
}
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}
下面是添加消息的servletview plaincopy to clipboardprint?
package hyjc.listener;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PutMsg extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
System.out.println("put message");
PrintWriter out = response.getWriter();
out.flush();
String msg = request.getParameter("message");
if (null != msg) {
MessageList.getInstance().add(msg);
} else {
System.out.println("添加消息:" + msg + "成果");
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package hyjc.listener;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class PutMsg extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
System.out.println("put message");
PrintWriter out = response.getWriter();
out.flush();
String msg = request.getParameter("message");
if (null != msg) {
MessageList.getInstance().add(msg);
} else {
System.out.println("添加消息:" + msg + "成果");
}
out.close();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}
下面是存放消息的消息队列,内部用阻塞队列使用view plaincopy to clipboardprint?
package hyjc.listener;
import java.util.Iterator;
import java.util.concurrent.LinkedBlockingQueue;
public class MessageList {
private static MessageList list = null;
private static Object key = new Object();
private MessageList() {
this.add("hello");
this.add("world");
}
public static MessageList getInstance() {
synchronized (key) {
if (list == null) {
list = new MessageList();
}
return list;
}
}
private LinkedBlockingQueue
public boolean isEmpty() {
return queue.isEmpty();
}
public int size() {
return queue.size();
}
public String get() {
try {
return queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public void clear() {
queue.clear();
}
public void add(String msg) {
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public Iterator
return queue.iterator();
}
}
package hyjc.listener;import java.util.Iterator;
import java.util.concurrent.LinkedBlockingQueue;public class MessageList { private static MessageList list = null; private static Object key = new Object(); private MessageList() {
this.add("hello");
this.add("world");
} public static MessageList getInstance() {
synchronized (key) {
if (list == null) {
list = new MessageList();
}
return list;
}
} private LinkedBlockingQueue
return queue.isEmpty();
} public int size() {
return queue.size();
} public String get() {
try {
return queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
} public void clear() {
queue.clear();
} public void add(String msg) {
try {
queue.put(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public Iterator
return queue.iterator();
}
}
下面是演示效果,输入message,点击submit,就会添加到MessageList中,然后会在GetMsg中继续执行,实现长连接 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/30/4140903.aspx本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/neusoftware_20063500/archive/2009/04/30/4140903.aspx
poll-pennery的意思
Ajax技术 寻做过或正在做基于Backbase开发包的项目的同行。交流一下工作经验。
ajax的一个问题
ajax + asp 的错误!
ajax的学习资料
Enya的Long Long Journey
AJAX的自动刷新技术
天使之吻的LONG LONG LONG全名是?
long long ago 中学背的课文
long long ago的中文歌词是什么?
before long 和long before 的区别
Enya的Long Long Journey歌词中文翻译
before long 和 long before 的不同
before long 和 long before 的不同
求好的Ajax的电子教材
请问Ajax技术指的是什么技术!
网页ajax的两个小问题
关于ajax一个例子的问题
long roud的中文歌词
long 的比较级是什么
基于构件的软件工程
基于API的文件传输
基于telnet的bbs
基于Web的调查