QLocalServer基于本地套接字socket的服务端server

0 703
索鸟 2021-04-08
需要:0索币

1.QLocalServer继承自QObject。

2.QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。
3.QLocalServer可以接受来自本地socket的连接。
4.server通过调用listen(),监听特定的连接。
5.newConnection()是在每次server与client连接上时所发出的信号。
6.nextPendingConnection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。
7.当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。
8.在监听过程中,通过 serverName()可以获取当前server监听的名称。
9.close()使QLocalServer停止对连接请求的监听。
10.虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。


服务端:

  1. #include <QApplication>
  2. #include <QtNetwork>
  3. class CServer
  4. : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. CServer()
  9. : m_server(NULL)
  10. {
  11. m_server = new QLocalServer(this);
  12. QObject::connect(m_server, SIGNAL(newConnection()), this, SLOT(serverNewConnectionHandler()));
  13. }
  14. ~CServer()
  15. {
  16. m_server->close();
  17. delete m_server;
  18. }
  19. void RunServer()
  20. {
  21. qDebug() << "Run Server ok";
  22. QLocalServer::removeServer("ServerName");//先移除原来的,若不移除同时存在,listen就会失败
  23. bool ok = m_server->listen("ServerName");//当有连接来时,QLocalServer会发生newConnection()信号,所以信号连接时在init中
  24. if (!ok)
  25. {
  26. // TODO:
  27. }
  28. }
  29. private slots:
  30. void serverNewConnectionHandler()
  31. {
  32. qDebug() << "New Connection";
  33. QLocalSocket* socket = m_server->nextPendingConnection();//获取客户端的QLocalServer
  34. QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler()));
  35. QObject::connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
  36. }
  37. void socketReadyReadHandler()
  38. {
  39. QLocalSocket* socket = static_cast<QLocalSocket*>(sender());
  40. if (socket)
  41. {
  42. QTextStream stream(socket);
  43. qDebug() << "Read Data From Client:" << stream.readAll();
  44. QString response = "Hello Client";
  45. socket->write(response.toUtf8());
  46. socket->flush();
  47. }
  48. // 返回到客户端的void sendMessage方法,m_socket->waitForReadyRead()之后的操作
  49. }
  50. private:
  51. QLocalServer *m_server;
  52. };
  53. int main(int argc, char *argv[])
  54. {
  55. // 至qt4.8(以上的不知道),在window下QApplication
  56. // 必需放到QLocalServer创建之前
  57. // 参考地址:http://www.qtcentre.org/archive/index.php/t-43522.html?s=26444975027844d43142ce2238f4605e
  58. QApplication app(argc, argv);
  59. CServer server;
  60. server.RunServer();
  61. return app.exec();
  62. }
  63. #include "main.moc"

客户端:

  1. #include <QApplication>
  2. #include <QtNetwork>
  3. class CClient
  4. : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. CClient()
  9. : m_socket(NULL)
  10. {
  11. m_socket = new QLocalSocket();
  12. QObject::connect(m_socket, SIGNAL(connected()), this, SLOT(socketConnectedHandler()));
  13. QObject::connect(m_socket, SIGNAL(disconnected()), this, SLOT(socketDisConnectedHandler()));
  14. QObject::connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(socketErrorHandler(QLocalSocket::LocalSocketError)));
  15. }
  16. ~CClient()
  17. {
  18. m_socket->disconnectFromServer();
  19. delete m_socket;
  20. }
  21. public:
  22. void ConnectToServer(const QString &strServerName)
  23. {
  24. // 服务端的serverNewConnectionHandler成员方法将被调用
  25. m_socket->connectToServer("ServerName");
  26. if (m_socket->waitForConnected())
  27. {
  28. // TODO:
  29. }
  30. }
  31. void sendMessage(const QString &msg)
  32. {
  33. m_socket->write(msg.toStdString().c_str());
  34. m_socket->flush();
  35. // waitForReadyRead将激发信号readyRead(), 我们在
  36. // 与服务端创建连接时,已将readyRead(),绑定到了服务
  37. // 端的槽socketReadyReadHandler成员方法
  38. if (!m_socket->bytesAvailable())
  39. m_socket->waitForReadyRead();
  40. QTextStream stream(m_socket);
  41. QString respond = stream.readAll();
  42. qDebug() << "Read Data From Server:" << respond;
  43. }
  44. private slots:
  45. void socketConnectedHandler()
  46. {
  47. qDebug() << "connected.";
  48. }
  49. void socketDisConnectedHandler()
  50. {
  51. qDebug() << "disconnected.";
  52. }
  53. void socketErrorHandler(QLocalSocket::LocalSocketError error)
  54. {
  55. qWarning() << error;
  56. }
  57. private:
  58. QLocalSocket *m_socket;
  59. };
  60. int main(int argc, char *argv[])
  61. {
  62. // 至qt4.8(以上的不知道),在window下QApplication
  63. // 必需放到QLocalServer创建之前
  64. // 参考地址:http://www.qtcentre.org/archive/index.php/t-43522.html?s=26444975027844d43142ce2238f4605e
  65. QApplication app(argc, argv);
  66. CClient client;
  67. client.ConnectToServer("ServerName");
  68. client.sendMessage("Hellow Server");
  69. return app.exec();
  70. }
  71. #include "main.moc"

原文:https://blog.csdn.net/LearnLHC/article/details/78907715

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0