我们目前在做一个基于sip协议(一个应用层的协议)的会议系统 ,其中sip消息的发送与接受主要通过开源的sip协议栈(jain-sip)在5060端口 通过udp协议来实现。
一个简单的设想就是 利用tomcat实现一些简单的jsp页面,在jsp页面中调用底层的实用类,在实用类中对jain-sip(java实现的sip的协议栈)初始化,并利用改协议栈 发出sip消息。
当我完成了底层的代码后 ,利用main()函数提交了一个会议,然后底层代码 能正常发送invite消息 给各个与会者,然后 当我利用tomcat容器中的jsp页面 来生成会议 并提交时 就出现如下错误
java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.MessageChannel.logMessage(MessageChannel.java:245) at gov.nist.javax.sip.stack.UDPMessageChannel.sendMessage(UDPMessageChannel.java:455) at gov.nist.javax.sip.stack.SIPClientTransaction.sendMessage(SIPClientTransaction.java:335) at gov.nist.javax.sip.stack.SIPClientTransaction.sendRequest(SIPClientTransaction.java:697) at jsp.Register.register(Register.java:249) at jsp.ScheduleConf$CreatConference.run(ScheduleConf.java:76) at java.util.TimerThread.mainLoop(Timer.java:432) at java.util.TimerThread.run(Timer.java:382)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:358) at gov.nist.javax.sip.stack.MessageChannel.logResponse(MessageChannel.java:275) at gov.nist.javax.sip.stack.SIPClientTransaction.processResponse(SIPClientTransaction.java:360) at gov.nist.javax.sip.stack.UDPMessageChannel.run(UDPMessageChannel.java:382) at java.lang.Thread.run(Thread.java:534)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.MessageChannel.logMessage(MessageChannel.java:245) at gov.nist.javax.sip.stack.UDPMessageChannel.sendMessage(UDPMessageChannel.java:455) at gov.nist.javax.sip.stack.SIPClientTransaction.fireRetransmissionTimer(SIPClientTransaction.java:729) at gov.nist.javax.sip.stack.SIPTransaction.fireTimer(SIPTransaction.java:462) at gov.nist.javax.sip.stack.SIPTransactionStack$TransactionScanner.run(SIPTransactionStack.java:477) at java.lang.Thread.run(Thread.java:534)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:358) at gov.nist.javax.sip.stack.MessageChannel.logResponse(MessageChannel.java:275) at gov.nist.javax.sip.stack.SIPClientTransaction.processResponse(SIPClientTransaction.java:360) at gov.nist.javax.sip.stack.UDPMessageChannel.run(UDPMessageChannel.java:382) at java.lang.Thread.run(Thread.java:534)java.lang.NullPointerException at jsp.ScheduleConf.endAllCall(ScheduleConf.java:368) at jsp.ConferenceManager.EndTimeListener(ConferenceManager.java:41) at jsp.ScheduleConf.fireCallStatusChangedEvent(ScheduleConf.java:732) at jsp.ScheduleConf$StopConference.run(ScheduleConf.java:62) at java.util.TimerThread.mainLoop(Timer.java:432) at java.util.TimerThread.run(Timer.java:382) 单步调试发现主要是运行到sendrequest()方法出错,这个方法 主要利用了udp的socket来发送sip消息。是不是tomcat容器的原因呢?请各位指点啊!!真的很急啊
一个简单的设想就是 利用tomcat实现一些简单的jsp页面,在jsp页面中调用底层的实用类,在实用类中对jain-sip(java实现的sip的协议栈)初始化,并利用改协议栈 发出sip消息。
当我完成了底层的代码后 ,利用main()函数提交了一个会议,然后底层代码 能正常发送invite消息 给各个与会者,然后 当我利用tomcat容器中的jsp页面 来生成会议 并提交时 就出现如下错误
java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.MessageChannel.logMessage(MessageChannel.java:245) at gov.nist.javax.sip.stack.UDPMessageChannel.sendMessage(UDPMessageChannel.java:455) at gov.nist.javax.sip.stack.SIPClientTransaction.sendMessage(SIPClientTransaction.java:335) at gov.nist.javax.sip.stack.SIPClientTransaction.sendRequest(SIPClientTransaction.java:697) at jsp.Register.register(Register.java:249) at jsp.ScheduleConf$CreatConference.run(ScheduleConf.java:76) at java.util.TimerThread.mainLoop(Timer.java:432) at java.util.TimerThread.run(Timer.java:382)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:358) at gov.nist.javax.sip.stack.MessageChannel.logResponse(MessageChannel.java:275) at gov.nist.javax.sip.stack.SIPClientTransaction.processResponse(SIPClientTransaction.java:360) at gov.nist.javax.sip.stack.UDPMessageChannel.run(UDPMessageChannel.java:382) at java.lang.Thread.run(Thread.java:534)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.MessageChannel.logMessage(MessageChannel.java:245) at gov.nist.javax.sip.stack.UDPMessageChannel.sendMessage(UDPMessageChannel.java:455) at gov.nist.javax.sip.stack.SIPClientTransaction.fireRetransmissionTimer(SIPClientTransaction.java:729) at gov.nist.javax.sip.stack.SIPTransaction.fireTimer(SIPTransaction.java:462) at gov.nist.javax.sip.stack.SIPTransactionStack$TransactionScanner.run(SIPTransactionStack.java:477) at java.lang.Thread.run(Thread.java:534)java.lang.IncompatibleClassChangeError at gov.nist.javax.sip.stack.MessageLog.<init>(MessageLog.java:103) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:235) at gov.nist.javax.sip.stack.ServerLog.logMessage(ServerLog.java:358) at gov.nist.javax.sip.stack.MessageChannel.logResponse(MessageChannel.java:275) at gov.nist.javax.sip.stack.SIPClientTransaction.processResponse(SIPClientTransaction.java:360) at gov.nist.javax.sip.stack.UDPMessageChannel.run(UDPMessageChannel.java:382) at java.lang.Thread.run(Thread.java:534)java.lang.NullPointerException at jsp.ScheduleConf.endAllCall(ScheduleConf.java:368) at jsp.ConferenceManager.EndTimeListener(ConferenceManager.java:41) at jsp.ScheduleConf.fireCallStatusChangedEvent(ScheduleConf.java:732) at jsp.ScheduleConf$StopConference.run(ScheduleConf.java:62) at java.util.TimerThread.mainLoop(Timer.java:432) at java.util.TimerThread.run(Timer.java:382) 单步调试发现主要是运行到sendrequest()方法出错,这个方法 主要利用了udp的socket来发送sip消息。是不是tomcat容器的原因呢?请各位指点啊!!真的很急啊
即把jsp文件改动一下,再访问
或把tomcat生成的jsp相关的java,class文件删了
Call-ID: [email protected]
CSeq: 1 REGISTER
From: "conf46" <sip:[email protected]:5060;transport=udp>;tag=12793391
To: "conf46" <sip:[email protected]:5060;transport=udp>
Via: SIP/2.0/UDP 210.42.147.175:5060;branch=z9hG4bK73869f63e3221b83a49ae8e9eb0dbb38
Max-Forwards: 70
Expires: 3600
Contact: "conf46" <sip:210.42.147.175:5060;transport=udp>
Content-Length: 0正确生成request后,调用底层协议栈中实用类的方法发送改请求:regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);
regTrans.sendRequest();可以看出 问题应该跟tomcat容器相关,如果我以main()函数的方式运行代码,而抛开tomcat,则 regTrans.sendRequest()能将request正确发送出去,但由jsp入口则发生以上异常!!实在不知道理之所在 请大家指点
主要是你在编译的时候用的JDK版本的不一致,你可以将所有的JAVA文件全部用一个版本的JDK编译一次,然后就不会出现了。
我觉得不用,因为你用普通的 Java Application 已经测试通过了,在 Web Application 中也会通过的>>>regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);
>>>regTrans.sendRequest();
但是,Web Application 在 Web 服务器运行会受到一些权限的限制,你上面的代码最好分解开,不要用连续的“指针”,因为其中某些值可能是 null,不利于调试。
现在打算把web页面 与会议逻辑分开以解决以上问题,web服务器主要利用tomcat实现会议预定啊等功能 就是实现一个ui,会议服务器呢基于jain-sip协议栈负责具体的与与会者的信令联系,其中web服务器与会议服务器用rmi通信,不知以上方案 是否可行?
regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);