我们目前在做一个基于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容器的原因呢?请各位指点啊!!真的很急啊

解决方案 »

  1.   

    看起来似乎你需要把 Tomcat 重新启动一下……
      

  2.   

    重新编译jsp试试
    即把jsp文件改动一下,再访问
    或把tomcat生成的jsp相关的java,class文件删了
      

  3.   

    重新编译也不行 ,同样的错误 我单步调试了 其中消息生成完全正确,生成的注册消息(request请求)如下:REGISTER sip:210.42.147.171:5060;transport=udp SIP/2.0
    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入口则发生以上异常!!实在不知道理之所在 请大家指点
      

  4.   

    是不是绑定request的时候冲突了??
      

  5.   

    把你的 request 变量改一下名字吧,request 在 jsp 中是默认的变量,它的类型是 HttpServletRequest,可能不是你期望的 SIPRequest 之类的
      

  6.   

    我把request改为request1后还是不行,是不是在tomcat中无法在特定端口用udp接受和发送数据啊,因为tomcat是基于http得servlet容器。或者servelet引擎无法对该协议栈 正确得使用呢。
      

  7.   

    java.lang.IncompatibleClassChangeError
    主要是你在编译的时候用的JDK版本的不一致,你可以将所有的JAVA文件全部用一个版本的JDK编译一次,然后就不会出现了。
      

  8.   

    >>> 楼上得意思是 我必须得把我下的协议栈也得从新编译一下?
    我觉得不用,因为你用普通的 Java Application 已经测试通过了,在 Web Application 中也会通过的>>>regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);
    >>>regTrans.sendRequest();
    但是,Web Application 在 Web 服务器运行会受到一些权限的限制,你上面的代码最好分解开,不要用连续的“指针”,因为其中某些值可能是 null,不利于调试。
      

  9.   

    现在在我看来 应该是该协议栈与web服务器 存在一定的冲突 ,至于代码regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);经过调试可以发现 没有问题,关键的异常出在regTrans.sendRequest(),而该方法则深入了协议栈内部 可见 是在运行协议栈内部代码时出错。
       现在打算把web页面 与会议逻辑分开以解决以上问题,web服务器主要利用tomcat实现会议预定啊等功能 就是实现一个ui,会议服务器呢基于jain-sip协议栈负责具体的与与会者的信令联系,其中web服务器与会议服务器用rmi通信,不知以上方案 是否可行?
      

  10.   

    我以前用 VC + 微软的开发包做过 SIP 的客户端,Java 环境下的还没仔细研究过,有空我们可以交流一下,我的 MSN Messenger:lovetide@msn.com至于你所提的方案,看起来你的会议服务器似乎是要实现一个“代理”的功能,好像挺麻烦的
      

  11.   

    不会和协议栈冲突的,我在tomcat下写过telnet服务,没问题。虽然你变量名改成request1,但是你这段代码中的request修改了吗?
    regTrans = registerprocessing.getsipmanager().sipProvider.getNewClientTransaction(request);