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