今天有空闲时间,试着学习一下用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端口建立连接,是不是又与跨域问题扯上关系了呢?
以上两个问题就是我想问的问题,相关的分析我也不知道是否正确,但是它们确实让我感觉到了困惑。如果我的分析不对,我真心地希望您的指点。 现在问题还没解,当然在等您的解答之前,我也会尽自己努力去思考,去查阅相关的解决方案。
问题解决,comet4j.js中获取url时把端口改成8080就行了,但我觉得另有蹊跷,虽然问题解决了.