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) {
......
接受消息
......
}