2011-04-06 41 views
0

我试图使用NIST的JAIN SIP API实现发送REGISTER SIP请求。使用NIST JAIN SIP API发送SIP请求时出错

首先我给我SipController类的数据成员的声明:

private int port; 
private long cseq = Math.abs(numberGenerator.nextInt()); 
private MessageFactory messageFactory; 
private AddressFactory addressFactory; 
private HeaderFactory headerFactory; 
private SipStack sipStack; 
private SipProvider sipProvider; 

,这里是发送请求的代码:

public void register(String aor,String serverAddress) throws ParseException,InvalidArgumentException,SipException 
    { 
     Address addressOfRecordObj = addressFactory.createAddress(aor); 
     ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(1); 
     try 
     { 
      viaHeaders.add(headerFactory.createViaHeader(InetAddress.getLocalHost().getHostAddress(),port,"udp",getNewBranch())); 
     } 
     catch (UnknownHostException e) 
     { 
      e.printStackTrace(); 
     } 
     Request request = messageFactory.createRequest( 
       ....addressFactory.createURI(serverAddress), 
       ...."REGISTER",sipProvider.getNewCallId(), 
       ....headerFactory.createCSeqHeader(cseq++,"REGISTER"), 
       ....headerFactory.createFromHeader(addressOfRecordObj,Integer.toString(Math.abs(numberGenerator.nextInt()))), 
       ....headerFactory.createToHeader(addressOfRecordObj,null), 
       ....viaHeaders, 
       ....headerFactory.createMaxForwardsHeader(70)); 
     request.addHeader(headerFactory.createContactHeader(addressFactory.createAddress("sip:127.0.0.1:"+port))); 
     log(">> "+request); 
     sipProvider.sendRequest(request); 
} 

我打电话使用语句

这种方法
sipController.register("sip:[email protected]","sip:127.0.0.1:5061"); 

数据成员端口的值为5060.

我想要做的是发送请求到我的计算机上运行的另一个应用程序,它正在侦听端口5061.此应用程序是我发送请求的同一程序的另一个实例。

当我调用SipProvider类的sendRequest()方法时,我得到一个javax.sip.SipException异常,并显示消息“发送请求时发生IO异常”。此异常包含一个java.net.BindException,其原因是消息“无法分配请求的地址:数据报发送失败”。

这里是堆栈跟踪:

javax.sip.SipException: IO Exception occured while Sending Request 
    at gov.nist.javax.sip.SipProviderImpl.sendRequest(SipProviderImpl.java:723) 
    at siptest.SipController.register(SipController.java:133) 
    at siptest.SipTestGuiFrontend$SendButtonListener.actionPerformed(SipTestGuiFrontend.java:213) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: java.net.BindException: Cannot assign requested address: Datagram send failed 
    at java.net.PlainDatagramSocketImpl.send(Native Method) 
    at java.net.DatagramSocket.send(Unknown Source) 
    at gov.nist.javax.sip.stack.UDPMessageChannel.sendMessage(UDPMessageChannel.java:743) 
    at gov.nist.javax.sip.stack.MessageChannel.sendMessage(MessageChannel.java:242) 
    at gov.nist.javax.sip.SipProviderImpl.sendRequest(SipProviderImpl.java:712) 
    ... 38 more 

在我做错了任何想法?

+0

您确定没有其他应用程序正在使用端口5060?你可以尝试绑定到不同的端口,如5080,看看注册是否有效。 – sipwiz 2011-04-06 22:45:05

回答

0

为了记录,我已经解决了这个问题。 这是一段时间以前,所以我不记得确切是什么错,但显然我使用了一个错误的.jar文件的NIST实现。