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

来源:互联网 发布:java 为什么没有二叉树 编辑:程序博客网 时间:2024/06/04 19:07

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:消息发送:

0 0
原创粉丝点击