sip2peer服務端研究分享4:BS,SBC Server分析:

1:BootstrapPeer(BS) Server 類似一個握手服務器,他記錄了請求的客戶端信息。
下面分析下 BS Server:
首先客戶端向BS Server發送握手請求。
然後BS Server接受到請求數據:onReceivedJSONMsg方法監聽接受數據。

    @Override
 protected void onReceivedJSONMsg(JSONObject peerMsg, Address sender) {
     ......
  //將客戶請求的信息進行保存,保存到peerList中.
  PeerDescriptor neighborPD = new PeerDescriptor(params.get("name").toString(), params.get("address").toString(), params.get("key").toString(), params.get("contactAddress").toString());
  NeighborPeerDescriptor neighborPeer = addNeighborPeer(neighborPD);
  ......
  if(newPLMsg!=null)
   //send(new Address(neighborPeer.getAddress()), newPLMsg);
   //將peerList中信息變量組裝後發送.
   send(neighborPeer, newPLMsg);
  ......
 }


接受數據的監聽是通過SipProviderListener接口:

public abstract interface SipProviderListener
{
  public abstract void onReceivedMessage(SipProvider paramSipProvider, Message paramMessage);
}

TransactionClientListener接口:監聽BS Server發送信息時的操作,例如發送失敗等.
public abstract interface TransactionClientListener
{
  public abstract void onTransProvisionalResponse(TransactionClient paramTransactionClient, Message paramMessage);

  public abstract void onTransSuccessResponse(TransactionClient paramTransactionClient, Message paramMessage);

  public abstract void onTransFailureResponse(TransactionClient paramTransactionClient, Message paramMessage);

  public abstract void onTransTimeout(TransactionClient paramTransactionClient);
}

2:SessionBorderController(SBC) Server 路由服務器。
SBC Server是sip2peer的核心,它主要實現了:對終端進行路由地址分配,消息轉發,消息處理,心跳處理等。
下面具體介紹:
SessionBorderController.java實現了接口TransactionClientListener.java;
GatewayPeer.java是消息通道,它是對請求需要握手的客戶端分配路由地址,端口,分配成功後消息通過該通道信息傳輸。

SessionBorderController.java
// initialize the SBC
 private void init(String file){
  this.sbcConfig = new SessionBorderControllerConfig(file);
  this.SBCAddress = new NameAddress(sip_provider.getContactAddress("SBC"));
  // new TestNATPeer 從sbc.cfg獲取端口,它是測試端口,只分配1個,如果將下面
  //代碼註釋掉後,端口sbc.cfg中init_port=6080向上加1分配
//  if(sbcConfig.testNATPort!=0)
//   this.testNATPeer = new TestNATPeer("testnat", sbcConfig.testNATPort, this);
  // new map for GatewayPeer
  this.listGatewayPeer = new HashMap<Integer, GatewayPeer>(sbcConfig.nMaxGatewayPeer);
 }
 
 //if the peer has sended MESSAGE with REQUEST_PORT
   else if(messageBody.equals("REQUEST_PORT")){
    String namePeer=null;
    int listenPort=0;
    NameAddress nameAddPeer = msg.getFromHeader().getNameAddress();
    if(nameAddPeer.hasDisplayName())  
     namePeer=nameAddPeer.getDisplayName();
    else
     namePeer=nameAddPeer.getAddress().getUserName();
                //分配空閒的端口
    listenPort = getFreePort();
    if(listenPort!=-1){
     //port available 創建自己的通道
     GatewayPeer gatewayPeer = new GatewayPeer(namePeer, listenPort);
     //add GatewayPeer instance to list 
     this.listGatewayPeer.put(listenPort, gatewayPeer);
     //send response message + contact <sip:namePeer@gatewayPeerAddress>
     TransactionServer transServer=new TransactionServer(sip_provider, msg, null);
     transServer.respondWith(MessageFactory.createResponse(msg, 200, SipResponses.reasonOf(200), gatewayPeer.getAddress()));
    }
 

 

GatewayPeer.java
    /**
  * Forward each message received to the local peer
  * 
  */
 @Override
 public void onReceivedMessage(SipProvider sipPeer, Message msgPeer) {
     ......
  接受消息
  ......
 }

 

sip2peer服務端研究分享3:消息發送:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章