未找到结果

您的搜索操作未匹配到任何结果

我们建议您尝试以下操作,以帮助您找到所需内容:

  • 检查关键词搜索的拼写。
  • 使用同义词代替键入的关键词,例如,尝试使用“应用”代替“软件”。
  • 请尝试下方显示的热门搜索之一。
  • 重新搜索。

 

热门问题

JAIN SIP API 简介

发送 SIP 请求

现有我们来写一个方法,它使用 JAIN SIP API 发送一条 SIP 消息。

在先决条件中,我曾建议您必须对 SIP 具备相当了解才可以开始使用 SIP API。现在您就会明白我那么说的原因了!SIP API 是相当底层的抽象,大多数情况下,它不使用默认值或隐藏头、请求 URI、或 SIP 消息的内容。这种设计的优点在于您可以完全控制 SIP 消息所包含的内容。

以下方法有点冗长。它准备并发送一个 SIP 请求。该方法大致可以分为四个子部分:

  • 创建主要元素
  • 创建消息
  • 完成消息
  • 发送消息

使用 JAIN SIP API 构造消息至少需要以下主要 SIP 元素:

  • 请求 URI
  • 方法
  • Call-ID 头
  • CSeq 头
  • From 头
  • Via 头数组
  • Max-forwards 头

有关这些元素的信息,请参见 SIP 简介,第 1 部分"(Dev2Dev,2006 年)。以下代码段创建所有这些元素:

 



 public void sendMessage(String to, String message) throws
                ParseException, InvalidArgumentException, SipException {
    
            SipURI from = addressFactory.createSipURI(getUsername(),
                    getHost() + ":" + getPort());
        Address fromNameAddress = addressFactory.createAddress(from);
            fromNameAddress.setDisplayName(getUsername());
            FromHeader fromHeader =
                    headerFactory.createFromHeader(fromNameAddress,
                            "textclientv1.0");
    
            String username = to.substring(to.indexOf(":")+1, to.indexOf("@"));
            String address = to.substring(to.indexOf("@")+1);
    
            SipURI toAddress =
                    addressFactory.createSipURI(username, address);
            Address toNameAddress = addressFactory.createAddress(toAddress);
            toNameAddress.setDisplayName(username);
            ToHeader toHeader =
                    headerFactory.createToHeader(toNameAddress, null);
    
            SipURI requestURI =
                    addressFactory.createSipURI(username, address);
            requestURI.setTransportParam("udp");
    
            ArrayList viaHeaders = new ArrayList();
            ViaHeader viaHeader =
                    headerFactory.createViaHeader(
                            getHost(),
                            getPort(),
                            "udp",
                            null);
            viaHeaders.add(viaHeader);
    
            CallIdHeader callIdHeader = sipProvider.getNewCallId();
    
            CSeqHeader cSeqHeader =
                    headerFactory.createCSeqHeader(1, Request.MESSAGE);
    
            MaxForwardsHeader maxForwards =
                    headerFactory.createMaxForwardsHeader(70);
            ...
                      
					  

我使用在构造函数中创建的工厂(HeaderFactoryAddressFactory)来实例化这些元素。

下面我们通过传递先前创建的所有元素来实例化实际的 SIP 消息本身。

 

      Request request =  messageFactory.createRequest(
        requestURI, Request.MESSAGE, callIdHeader, cSeqHeader,
        fromHeader, toHeader, viaHeaders,       maxForwards);
...

                      

注意在此步骤中使用了 MessageFactory

然后向消息中添加其他元素:Contact 头和消息的内容(负载)。此时也可以添加自定义头。


    SipURI contactURI = addressFactory.createSipURI(getUsername(),
                getHost());
        contactURI.setPort(getPort());
        Address contactAddress = addressFactory.createAddress(contactURI);
        contactAddress.setDisplayName(getUsername());
        ContactHeader contactHeader =
                headerFactory.createContactHeader(contactAddress);
        request.addHeader(contactHeader);

        ContentTypeHeader contentTypeHeader =
                headerFactory.createContentTypeHeader("text", "plain");
        request.setContent(message, contentTypeHeader);
        ...
                      

有关如何进一步处理请求的信息,可参见附录中对 Request 接口的描述。


    sipProvider.sendRequest(request);
}
                      

在对话内发送消息

现在您是在对话外部发送消息。这意味着消息彼此不相关。这非常适用于像 TextClient 这样的简单即时消息传递应用程序。

也可以使用 INVITE 消息创建一个对话(有时称为会话),然后在此对话中发送消息。TextClient 不采用这种方法。不过我认为有必要对这种方法有所了解。因此作为折衷方案,本子部分介绍如何实现此方法。

在对话内发送消息需要创建 DialogTransaction 对象。在初始消息(即创建对话的消息)中,您将实例化一个 Transaction,然后从其获取 Dialog,而不是使用提供程序发送消息。保留 Dialog 引用以便稍后使用。然后使用 Transaction 发送消息:


ClientTransaction trans = sipProvider.getNewClientTransaction(invite);
dialog = trans.getDialog();
trans.sendRequest();

                      

稍后,当您希望在同一对话内发送一条新消息时,可使用前面的 Dialog 对象创建一个新请求。然后您可以对请求进行处理,最后使用 Transaction 发送消息。


request = dialog.createRequest(Request.MESSAGE);

request.setHeader(contactHeader);
request.setContent(message, contentTypeHeader);

ClientTransaction trans = sipProvider.getNewClientTransaction(request);
trans.sendRequest();

                      

从本质上说,当您在现有对话内发送消息时,将跳过 创建主要元素"这一步骤。当您使用 INVITE 创建对话时,不要忘记在结束时发送对话内 BYE 消息来清除该对话。此方法还可用于刷新注册和订阅。

前面您已经见到 SipListener 接口,它包含 processDialogTerminated()processTransactionTerminated() 方法。在对话和事务结束时分别自动调用这两个方法。通常您可以使用这些方法来进行清理(例如丢弃 DialogTransaction 实例)。由于在 TextClient 中不需要这两个方法,因此将其保留为空。