Ajax 如何从网页调用此Comets应用程序
我已经实现了上面显示的两个类,它们使用Tomcat的comet实现提供了一个messenger应用程序 如何将其连接到web界面并获得要显示的内容 我认为这些是基本步骤(我不知道细节)Ajax 如何从网页调用此Comets应用程序,ajax,tomcat,servlets,comet,server-push,Ajax,Tomcat,Servlets,Comet,Server Push,我已经实现了上面显示的两个类,它们使用Tomcat的comet实现提供了一个messenger应用程序 如何将其连接到web界面并获得要显示的内容 我认为这些是基本步骤(我不知道细节) 我应该创建一些传统事件——按钮单击或AJAX事件——调用ChatServlet并以某种方式传入CometEvent(可能是开始) 从那时起,每当我想使用READ事件作为输入参数向客户机发送内容时,我的代码都会调用event方法 我复制了以下两个类: 包装控制器; 导入java.io.IOException; 导
包装控制器;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.catalina.CometEvent;
导入org.apache.catalina.com处理器;
公共类ChatServlet扩展了HttpServlet处理器{
受保护的ArrayList连接=新建ArrayList();
受保护的MessageSender=null;
public void init()引发ServletException{
messageSender=新建messageSender();
线程messageSenderThread=新线程(messageSender,“messageSender[”
+getServletContext().getContextPath()+“]”;
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
公共空间销毁(){
连接。清除();
messageSender.stop();
messageSender=null;
}
/**
*处理给定的Comet事件。
*
*@param事件
*将要处理的Comet事件
*@抛出异常
*@ServletException
*/
公共无效事件(CometEvent事件)引发IOException、ServletException{
HttpServletRequest=event.getHttpServletRequest();
HttpServletResponse=event.getHttpServletResponse();
if(event.getEventType()==CometEvent.EventType.BEGIN){
日志(“开始会话:+request.getSession(true.getId());
PrintWriter=response.getWriter();
作家
.println(“”);
作家
.println(“JSP聊天”);
writer.flush();
已同步(连接){
连接。添加(响应);
}
}else if(event.getEventType()==CometEvent.EventType.ERROR){
日志(“会话错误:+request.getSession(true.getId());
已同步(连接){
连接。移除(响应);
}
event.close();
}else if(event.getEventType()==CometEvent.EventType.END){
日志(“会话结束:+request.getSession(true.getId());
已同步(连接){
连接。移除(响应);
}
PrintWriter=response.getWriter();
writer.println(“”);
event.close();
}else if(event.getEventType()==CometEvent.EventType.READ){
InputStream=request.getInputStream();
字节[]buf=新字节[512];
做{
int n=is.read(buf);//可以引发IOException
如果(n>0){
日志(“读取”+n+”字节:“+新字符串(buf,0,n)
+“对于会话:”
+request.getSession(true.getId());
}else if(n<0){
//错误(事件、请求、响应);
System.out.println(“您有一个错误”);
返回;
}
}而(is.available()>0);
}
}
}
包装控制器;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入javax.servlet.http.HttpServletResponse;
公共类MessageSender实现可运行{
受保护的布尔运行=真;
受保护的ArrayList消息=新建ArrayList();
受保护的ArrayList连接=新建ArrayList();
公共消息发送者(){
}
公共停车场(){
运行=错误;
}
/**
*添加用于发送的消息。
*/
公共无效发送(字符串用户、字符串消息){
已同步(消息){
消息。添加(“[”+用户+”]:“+消息);
messages.notify();
}
}
公开募捐{
(跑步时){
if(messages.size()==0){
试一试{
已同步(消息){
messages.wait();
}
}捕捉(中断异常e){
//忽略
}
}
已同步(连接){
字符串[]pendingMessages=null;
已同步(消息){
pendingMessages=messages.toArray(新字符串[0]);
messages.clear();
}
//在所有打开的连接上发送任何挂起的消息
对于(int i=0;i”);
}
writer.flush();
}捕获(IOE异常){
System.out.println(“IOEXECTION发送消息”+e);
}
}
}
}
}
}
这里有一个完整的Tomcat示例,可在底部下载源代码:您是否能够顺利完成该教程。我能够让Comets部分工作,但我没有得到天气数据,而是得到了.jsp页面,该页面应该调用servlet,并在HTTPResponse对象中返回。我只测试了TomcatWeatherServlet,它工作了。您正在使用Eclipse吗?我可以将项目压缩并发送给您。是的,我正在使用Eclipse,您可以通过gmail.com给我发送电子邮件ankurshardais吗?非常感谢
package controller;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;
public class ChatServlet extends HttpServlet implements CometProcessor {
protected ArrayList<HttpServletResponse> connections = new ArrayList<HttpServletResponse>();
protected MessageSender messageSender = null;
public void init() throws ServletException {
messageSender = new MessageSender();
Thread messageSenderThread = new Thread(messageSender, "MessageSender["
+ getServletContext().getContextPath() + "]");
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
public void destroy() {
connections.clear();
messageSender.stop();
messageSender = null;
}
/**
* Process the given Comet event.
*
* @param event
* The Comet event that will be processed
* @throws IOException
* @throws ServletException
*/
public void event(CometEvent event) throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == CometEvent.EventType.BEGIN) {
log("Begin for session: " + request.getSession(true).getId());
PrintWriter writer = response.getWriter();
writer
.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
writer
.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
writer.flush();
synchronized (connections) {
connections.add(response);
}
} else if (event.getEventType() == CometEvent.EventType.ERROR) {
log("Error for session: " + request.getSession(true).getId());
synchronized (connections) {
connections.remove(response);
}
event.close();
} else if (event.getEventType() == CometEvent.EventType.END) {
log("End for session: " + request.getSession(true).getId());
synchronized (connections) {
connections.remove(response);
}
PrintWriter writer = response.getWriter();
writer.println("</body></html>");
event.close();
} else if (event.getEventType() == CometEvent.EventType.READ) {
InputStream is = request.getInputStream();
byte[] buf = new byte[512];
do {
int n = is.read(buf); // can throw an IOException
if (n > 0) {
log("Read " + n + " bytes: " + new String(buf, 0, n)
+ " for session: "
+ request.getSession(true).getId());
} else if (n < 0) {
// error(event, request, response);
System.out.println("you have an error");
return;
}
} while (is.available() > 0);
}
}
}
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.http.HttpServletResponse;
public class MessageSender implements Runnable {
protected boolean running = true;
protected ArrayList<String> messages = new ArrayList<String>();
protected ArrayList<HttpServletResponse> connections = new ArrayList<HttpServletResponse>();
public MessageSender() {
}
public void stop() {
running = false;
}
/**
* Add message for sending.
*/
public void send(String user, String message) {
synchronized (messages) {
messages.add("[" + user + "]: " + message);
messages.notify();
}
}
public void run() {
while (running) {
if (messages.size() == 0) {
try {
synchronized (messages) {
messages.wait();
}
} catch (InterruptedException e) {
// Ignore
}
}
synchronized (connections) {
String[] pendingMessages = null;
synchronized (messages) {
pendingMessages = messages.toArray(new String[0]);
messages.clear();
}
// Send any pending message on all the open connections
for (int i = 0; i < connections.size(); i++) {
try {
PrintWriter writer = connections.get(i).getWriter();
for (int j = 0; j < pendingMessages.length; j++) {
writer.println(pendingMessages[j] + "<br>");
}
writer.flush();
} catch (IOException e) {
System.out.println("IOExeption sending message" + e);
}
}
}
}
}
}