(2)咚咚客户端核心设计原理分析 - 代码流程篇 (套接字建立,发送消息流程,接收消息流程)

京麦Tcp建立连接流程:
ConnectTask.run() -> connection.connect()(这里面也注册了一个连接状态的一个回调类) -》 tryToConnectOnTracker (建立连接) ——》 选址(根据TbTracker)然后 -》 realconnect -》socket.connect (真正建立连接)

(initconnect 一些初始化的参数,比如 host port 等)

tryToConnectOnTracker.成功连接到->ap-dd1.jd.com:443  (log 打出说明已经建立成功)

初始化  connection 然后在里面添加  读取类和 写入类的监听 (listener.connectionSuccessful(); 回调成功诶说明建立连接成功)

 

京麦咚咚 - 发送一条消息的流程:sendTxtMessage 

FragmentChatting。sendTxtMessage ->  ChatMessageSendUtils.sendTextMessage (同时添加item到mChattingMsgAdapter,滑动到item的底部位置)-》 ServiceManager.getInstance().sendMessageChat-》
ServiceManager.sendCommand(本质:NotificationService.startService)->NotificationService.performCommand(intent, command)(这个方法其实在start方法里);  -》  NotificationService.doCmdSendPacket -》 NetCoreManager.sendMessage
->NetCoreConnection.sendMessage-》mPacketWriter.sendMessage()    -> 调用套接字输入流进行输出

京麦咚咚 - 接收一条消息的流程:

PackReader.parsePackets()(这里面其实也是一套死循环,去socket读取到缓冲区,然后按照包的开始和终止位置进行makePacket()) - >PackReader.parsePacket()
->AbstractConnection.firePacketReceivedListenersNoFilter-> mPacketListener.processPacket(packet); ->mNetCoreMgr.getCoreModel().processRecvPacket(packet);-> mRecvProcesser.processPacket(packet);(基本上所有的消息都在这里处理)-preprocessPacket()(做一个预处理)intent.putExtra(TcpConstant.SERVICE_BROADCAST_OBJECT1, (Serializable) o1) (发送一个 广播)-》
BaseHelper - onServiceNotifyBroadcast方法中获取收到的消息然后在方法到各个实现了mHelperInterface接口的activity页面去

咚咚读取一条消息的流程:
 

当然,我可以为您提供一个简单的模仿通话流程的QT界面代码示例。以下是一个基本的示例,其中包含了两个用户之间的简单通话流程。 ```cpp #include <QtWidgets> class ChatWidget : public QWidget { Q_OBJECT public: ChatWidget(QWidget *parent = nullptr) : QWidget(parent) { // 设置窗口属性 setWindowTitle("模仿通话流程"); setFixedSize(400, 500); // 创建布局 QVBoxLayout *layout = new QVBoxLayout; setLayout(layout); // 创建聊天记录区域 chatArea = new QTextEdit; chatArea->setReadOnly(true); layout->addWidget(chatArea); // 创建输入框和发送按钮 QHBoxLayout *inputLayout = new QHBoxLayout; layout->addLayout(inputLayout); inputBox = new QLineEdit; inputLayout->addWidget(inputBox); sendButton = new QPushButton("发送"); inputLayout->addWidget(sendButton); // 连接发送按钮的点击事件 connect(sendButton, &QPushButton::clicked, this, &ChatWidget::sendMessage); } private slots: void sendMessage() { QString message = inputBox->text(); // 在聊天记录中显示发送消息 chatArea->append("我说: " + message); // 清空输入框 inputBox->clear(); // 模拟接收方回复 QString reply = "对方说: " + message + ",收到!"; // 在聊天记录中显示接收方的回复 chatArea->append(reply); } private: QTextEdit *chatArea; QLineEdit *inputBox; QPushButton *sendButton; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); ChatWidget chatWidget; chatWidget.show(); return app.exec(); } #include "main.moc" ``` 这是一个简单的聊天界面,包含一个聊天记录区域、一个输入框和一个发送按钮。用户可以在输入框中输入消息并通过点击发送按钮发送发送后,消息将显示在聊天记录区域中,然后模拟接收方会回复相同的消息。 请注意,这只是一个简单的示例,您可以根据需要进行自定义和扩展。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值