当前位置:   article > 正文

进程通信学习——QLocalSocket和QLocalServer_qlocalserver 与qlocalsocket通信,能否同时双向发送消息

qlocalserver 与qlocalsocket通信,能否同时双向发送消息

Qt中IPC之一的QLocalSocket和QLocalServer实现了单工与双工通信。在qtdemo中有例子说明,这里作自己的理解实现双工通信的过程。

服务端:

  1. QLocalSocket*m_socket ;
  2. ///----------------------------------------------------------------------------------
  3. //初始化Server,监听特定连接
  4. void initServer()
  5. {
  6. QLocalServer* m_server = new QLocalServer(this);//创建服务端
  7.   bool a = connect(m_server,SIGNAL(newConnection()), this, SLOT(onNewConnection()));//连接服务端收到的连接信号,即当客户端socket调用connectToServer函数时响应
  8.   QLocalServer::removeServer("IPCConnect");//移除服务端已有连接,保证本次监听成功
  9. if (!m_server->listen("IPCConnect"))//监听特定的连接
  10. {
  11. QMessageBox::warning(this,"警告","监听失败!");
  12. }
  13. }
  14. //----------------------------------------------------------------------------------
  15. //新链接影响槽函数,获取发送端socket,设置槽函数影响收到来自发送端socket的信号
  16. void onNewConnection()
  17. {
  18. if (m_server->hasPendingConnections())//如果服务端有一个待处理的连接
  19. {
  20. m_socket = new QLocalSocket(this);//创建一个套接字
  21. m_socket = m_server->nextPendingConnection();//获取连接上的套接字的对象,也就是客户端套接字对象
  22. connect(m_socket,SIGNAL(readyRead()),this,SLOT(OnReadyRead()));//订阅该套接字信号
  23. }
  24. }
  25. //-----------------------------------------------------------------------------------
  26. //收到套接字传过来的信号时响应
  27. void OnReadyRead()
  28. {
  29. QByteArray dataArray = m_socket->readAll();//读取传输所有数据
  30. char* readdata = dataArray.data();//转换数据为char数组
  31. QString str = QString::fromLocal8Bit((const char*)readdata);//转换为字符串
  32. }
  33. //---------------------------------------------------------------------------------
  34. //发送数据到客户端
  35. void SendData(QString data)
  36. {
  37. m_socket->write(strData.toUtf8());//写入
  38. if (!m_socket->waitForBytesWritten())//等待写入是否成功
  39. {
  40. QMessageBox::warning(this,"提示","发送数据失败!");
  41. }
  42. }

注:初始化函数中, QLocalServer::removeServer("IPCConnect");为防止下一步监听失败,先移除一次该连接。

 

客户端:

  1. QLocalSocket *m_Socket;//用于客户端发送数据的套接字
  2. //--------------------------------------------------------------------------------
  3. void OnInitClient()
  4. {
  5. m_Socket = new QLocalSocket(this);//创建一个套接字
  6. m_Socket->connectToServer("IPCConnect");//尝试连接同名的服务端(前提是客服务端已经初始化完毕)
  7. if(m_Socket->waitForConnected(1000));//等待连接(时常可设置,这里设置1000ms)
  8. {
  9. QMessageBox::warning(this,"警告","连接失败!");
  10. return;
  11. }
  12. bool a = connect(m_Socket,SIGNAL(readyRead()),this,SLOT(OnReceiveMessage()));//响应由服务端使用本套接字发送的数据信号
  13. }
  14. //---------------------------------------------------------------------------------
  15. //响应接收数据
  16. void OnReceiveMessage()
  17. {
  18. QByteArray dataArray = m_Socket->readAll();//读取传输所有数据
  19. char* readdata = dataArray.data();//转换数据为char数组
  20. QString str = QString::fromLocal8Bit((const char*)readdata);//转换为字符串
  21. }
  22. //---------------------------------------------------------------------------------
  23. //发送数据到服务端
  24. void SendData(QString str)
  25. {
  26. m_Socket->write(strData.toUtf8());//写入
  27. if (!m_Socket->waitForBytesWritten())//等待写入是否成功
  28. {
  29. QMessageBox::warning(this,"提示","发送数据失败!");
  30. }
  31. }

服务端和客户端分别初始化完成后,分别调用发送函数即可实现双工了。

//-------------------------------------------------------------------------------------------------------------------------------------

这里只是实现了一个socket套接字的收发,也可以通过多个Socket同时使用,可以在接收端槽函数中通过

QLocalSocket *local = static_cast<QLocalSocket *>(sender()); 获取发送端套接字对象。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/184748?site
推荐阅读
相关标签
  

闽ICP备14008679号