首页 新闻 赞助 找找看

tomcat+comet4j遇到的"HTTP Status 405"问题,求解决方案

0
悬赏园豆:50 [已关闭问题] 关闭于 2014-01-05 18:07

今天有空闲时间,试着学习一下用comet4j推送框架实现服务器推送功能,遇到了一个"405 Method Not Allowed"。具体如下

环境是:win7(64位)+tomcat6.0.37

访问tomcat的端口号为:8888

demo参照http://code.google.com/p/comet4j/wiki/HelloWorld;

myeclipse中的结构为

 

 

 

helloword.html为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="js/comet4j-0.0.2.js"></script>
<script type="text/javascript">
function init(){
        var kbDom = document.getElementById('kb');
        JS.Engine.on({
                hello : function(kb){//侦听一个channel
                        kbDom.innerHTML = kb;
                }
        });
        JS.Engine.start('conn');
}
</script>
</head>
<body onload="init()">
        剩余内存:<span id="kb">...</span>KB
</body>
</html>

web.xml配置为:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <listener>
        <description>Comet4J容器侦听</description>
        <listener-class>org.comet4j.core.CometAppListener</listener-class>
    </listener>
    <servlet>
        <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
        <display-name>CometServlet</display-name>
        <servlet-name>CometServlet</servlet-name>
        <servlet-class>org.comet4j.core.CometServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CometServlet</servlet-name>
        <url-pattern>/conn</url-pattern>
    </servlet-mapping>

    <listener>
        <description>HelloWorld</description>
        <listener-class>org.comet4j.HelloWorld</listener-class>
    </listener>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

在tomcat的server.xml中加入的配置为:

  <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" 
        protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

以上是一些代码和相关的配置信息,下面就是我遇到的问题:

在浏览器中访问helloworld.html

出现"405 (Method Not Allowed)"错误信息.

如下是我个人的分析:

1、出现405错误,一般情况下是doget 或 dopost方法没写导致。

2、通过html中的 JS.Engine.start('conn');

  与web.xml中的配置

<servlet>
        <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
        <display-name>CometServlet</display-name>
        <servlet-name>CometServlet</servlet-name>
        <servlet-class>org.comet4j.core.CometServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CometServlet</servlet-name>
        <url-pattern>/conn</url-pattern>
    </servlet-mapping>
,推出JS.Engine.start('conn')后请求的是
org.comet4j.core.CometServlet,而org.comet4j.core.CometServlet这个类是打包在comet4j-tomcat6.jar里面。 从而我个人就推得(问题一):可能是comet4j-tomcat6.jar这个jar包有问题

3、对于tomcat中加入的那段配置(是为了调整服务器的连接器为NOI连接器),其中port=8080,而我的tomcat端口号8888,两个是不同的,若将加入那个段配置中的port改为8888,使得端口号相同,这样就会导致在启动tomcat的时候报端口号被占用的错误.从而就可以知道comet4j工作的端口与实际项目的端口是不同的。

4、通过3的分析,将

中的端口改为8080,单独去请求,则可以正常返回json数据.

再结合JS.Engine.start('conn'); 可知start启动时是通过8080端口建立的NIO连接,那么8888端口的页面通过js(ajax)去与8080端口建立连接,是不是又与跨域问题扯上关系了呢?这是我的第二个疑问。

综合:

1、可能是comet4j-tomcat6.jar这个jar包有问题

2、那么在8888端口的页面通过js(ajax请求)去与8080端口建立连接,是不是又与跨域问题扯上关系了呢?

以上两个问题就是我想问的问题,相关的分析我也不知道是否正确,但是它们确实让我感觉到了困惑。如果我的分析不对,我真心地希望您的指点。 现在问题还没解,当然在等您的解答之前,我也会尽自己努力去思考,去查阅相关的解决方案。

小名色素的主页 小名色素 | 菜鸟二级 | 园豆:204
提问于:2014-01-03 20:44
< >
分享
所有回答(1)
0

问题解决,comet4j.js中获取url时把端口改成8080就行了,但我觉得另有蹊跷,虽然问题解决了.

小名色素 | 园豆:204 (菜鸟二级) | 2014-01-05 18:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册