libjingle重要概念阅读

信号

    • 有点类似注册信号之类的东西,如果对这个不熟,自己慢慢看书去吧。

线程

libjiingle使用多线程来使应用程序有更好的性能。一般libjingle有一个或者两个全局的线程:

1.signaling thread,信号线程。用来创建基本组件,例如Session Management和Control and XMPP Messaging组件。

2.worker thread工作线程,有时在代码里称作channel thread,用作P2P对象处理资源集中的过程,例如数据流。用到worker thread的有ChannelManage,SocketMonitor,P2PTransportChannel和Port对象。要使能第二条线程,必须给SessionManager传递一个Thread对象。示例代码:CallClient::InitPhone演示了怎样为低层组件创建worker thread的过程。

另外,libjingle现在提供了一个叫SignalThread的基类。扩展它来使能它自己的thread,便可以让它自己去完成初始化,开始,销毁自己。可以参考signalthread.h/.cc得到更多的信息。

libjingle包装了所有的线程,包括signaling thread,worker thread, 和其它任何线程,用talk_base::Thread来包装。所有的 Thread对象由ThreadManager来管理 ,ThreadManager可以通过请求来获取线程。SessionManager通过一个signaling thread(和一个worker thread,如果没有提供)调用ThreadManager::CurrentThread来实现它。XmppPump用当前的线程作为它的signaling thread。因此,你必须在创建SessionManager对象之前,或者在XmppPump开始工作之前,为signaling thread创建一个Thread对象并将它push到ThreadManager的线程池。示例代码请参考Signing In to a Server   有两种创建线程的方法

1.AutoThread 用libjingle的Thread对象包装的操作系统线程,并使它成为ThreadManager对象的线程池中的当前线程,(也就是说,当用Thread::CurrentThread调用时返回引线程)

2.Thread 典型用为worker thread,必须创建一个Thread 对象,调用ThreadManager::Add或者ThreadManager::SetCurrent来将它加入池,并调用Run来开始它的循环代码,或者Start来开始线程监听。

2011.03.01

Threads为对象间或对象内部提供一个消息管道。例如,SocketManager在另一个线程给它自己发了一消息来销毁一个socket,或者发给SessionManager,当连接候选者已经生成。Thread对象继承了MessageQueue,和它一起expose了Send,Post和其它一些为了实现同步或异步发消息的函数。一个对象会通过MessageQueue接收消息必须继承并实现MessageHandler。MessageHandler定义了OnMessage方法,这个方法在MessageQueue消息中调用。

    你可以向任何线程的任何对象发送消息,只要这个对象继承了talk_base::MessageHandler。尽管如此,如果向一个资源敏感(resource-instensive)的线程发送消息,应该在worker thread上发送。可以通过SessionManager::worker_thread()来获得worker thread的handle。 通过SessionManager::signaling_thread()来获得signaling thread的handle。

   一个对象可以有两种方法来获得特定的线程:它可以请求并保存一个线程指针,以输入参数的形式;它可以假定当前线程是一个特定线程并用一个成员来指向它;它可以SessionManager::worker_thread()和SessionManager::signaling_thread()来获取线程。所有的这三种方法在libjingle里都有用到。

    因为一个对象可以在任何线程里面被调用,所以对象可能需要检查这个方法是从哪个线程里调用的。为了实现这个,调用Thread::Current并与一个已知的thread对比其值,---这可能是SessionManager中显示的一个thread,或者这个对象可以保存一个指针指向它的初始线程,在构造函数里面。这有个例子,在另一线程里调用同一个对象的方法。

Code Snippet
  1. // Note that worker_thread_ is not initialized until someone
  2. // calls PseudoTcpChannel::Connect
  3. // Also note that this method *is* thread-safe.
  4. bool PseudoTcpChannel::Connect(const std::string& channel_name) {
  5.   ASSERT(signal_thread_->IsCurrent());
  6.   CritScope lock(&cs_);
  7.     if (channel_)
  8.       return false;
  9.     ASSERT(session_ != NULL);
  10.     worker_thread_ = session_->session_manager()->worker_thread();
  11. ...
  12. }
  13.  
  14. void PseudoTcpChannel::SomeFunction(){
  15.   ...
  16.   // Post a message to yourself over the worker thread.
  17.   worker_thread_->Post(this, MSG_PING); // <- Goes in here....
  18.   ...
  19. }
  20.  
  21. // Handle queued requests.
  22. void PseudoTcpChannel::OnMessage(Message *pmsg) {
  23.   if (pmsg->message_id == MSG_SORT)
  24.     OnSort();
  25.   else if (pmsg->message_id == MSG_PING) // -> And comes out here!
  26.     // Check that we're in the worker thread before proceding.
  27.     ASSERT(worker_thread_->IsCurrent());
  28.     OnPing();
  29.   else if (pmsg->message_id == MSG_ALLOCATE)
  30.     OnAllocate();
  31.   else
  32.     assert(false);
  33. }

命名习惯(命名约定)

libjingle有一些约定的命名约定,值得注意

OnSomeMethod  “On”代表连接到信号signal,可能是从这个对象或别的对象。如果从同一对象调用,非常可能是在另一线程中被调用

SomeMethod_w  “_w”存在在worker threaad中,但在另外的线程中被调用

SignalSomeName 这些是信号,发送消息给回调函数

 

SSL 支持

libjingle支持两种SSL

OpenSSL  for UNIX

SChannel    for Windows

连接Connections

一个libjingle的P2P连接实际上包含两个通道

一个是session negotiation channel,也叫做signaling channel,是一个用于协商数据连接的通信链接。

另一个是data channel数据通道   它传输实际的数据(音频,视频,文件等)。可以是TCP或UDP,并不经过XMPP服务器。

协商通道首先建立,用来协商数据通道的细节。

后面还有这些就不说了---本文作者注

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值