前言

承接上一节<4-11 client的信令逻辑>
image.png
从PeerConnectionClient::DoConnect开始。

PeerConnectionClient::DoConnect

该函数

  1. void PeerConnectionClient::DoConnect() {
  2. // 创建控制control_socket,用于和服务器连接
  3. control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
  4. // 创建hanging socket,用于
  5. hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
  6. // 初始化socket信号,里面是信号与槽函数的绑定
  7. InitSocketSignals();
  8. char buffer[1024];
  9. snprintf(buffer, sizeof(buffer), "GET /sign_in?%s HTTP/1.0\r\n\r\n",
  10. client_name_.c_str());
  11. onconnect_data_ = buffer;
  12. bool ret = ConnectControlSocket();
  13. if (ret)
  14. state_ = SIGNING_IN;
  15. if (!ret) {
  16. callback_->OnServerConnectionFailure();
  17. }
  18. }

在此打断点,单击连接的时候,的堆栈如下
image.png

发送消息流程

image.png
image.png
当另一个client连接后,单击该client进行通信。就会调用MainWnd::QueueUIThreadCallback,发送消息到主线程去处理。
image.png

主线程接收后,是Conductor::UIThreadCallback处理。
image.png

  1. void Conductor::UIThreadCallback(int msg_id, void* data) {
  2. switch (msg_id) {
  3. case PEER_CONNECTION_CLOSED: //对端关闭了
  4. RTC_LOG(INFO) << "PEER_CONNECTION_CLOSED";
  5. DeletePeerConnection();
  6. if (main_wnd_->IsWindow()) {
  7. if (client_->is_connected()) {
  8. main_wnd_->SwitchToPeerList(client_->peers());
  9. } else {
  10. main_wnd_->SwitchToConnectUI();
  11. }
  12. } else {
  13. DisconnectFromServer();
  14. }
  15. break;
  16. case SEND_MESSAGE_TO_PEER: { //发送消息到对端
  17. RTC_LOG(INFO) << "SEND_MESSAGE_TO_PEER";
  18. std::string* msg = reinterpret_cast<std::string*>(data);
  19. if (msg) {
  20. // For convenience, we always run the message through the queue.
  21. // This way we can be sure that messages are sent to the server
  22. // in the same order they were signaled without much hassle.
  23. pending_messages_.push_back(msg);
  24. }
  25. if (!pending_messages_.empty() && !client_->IsSendingMessage()) {
  26. msg = pending_messages_.front();
  27. pending_messages_.pop_front();
  28. if (!client_->SendToPeer(peer_id_, *msg) && peer_id_ != -1) {
  29. RTC_LOG(LS_ERROR) << "SendToPeer failed";
  30. DisconnectFromServer();
  31. }
  32. delete msg;
  33. }
  34. if (!peer_connection_.get())
  35. peer_id_ = -1;
  36. break;
  37. }
  38. case NEW_TRACK_ADDED: { // 新的视频通道
  39. auto* track = reinterpret_cast<webrtc::MediaStreamTrackInterface*>(data);
  40. if (track->kind() == webrtc::MediaStreamTrackInterface::kVideoKind) {
  41. auto* video_track = static_cast<webrtc::VideoTrackInterface*>(track);
  42. main_wnd_->StartRemoteRenderer(video_track);
  43. }
  44. track->Release();
  45. break;
  46. }
  47. case TRACK_REMOVED: { // 对端停止发送了一个track
  48. // Remote peer stopped sending a track.
  49. auto* track = reinterpret_cast<webrtc::MediaStreamTrackInterface*>(data);
  50. track->Release();
  51. break;
  52. }
  53. default:
  54. RTC_NOTREACHED();
  55. break;
  56. }
  57. }