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

suoniao 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

回帖
  • 消灭零回复
相关主题
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0
Qt获取父进程路径和父进程ID代码 0
QStyledItemDelegate和QItemDelegate区别在于绘制和向视图提供编辑器的方式 0
Qt实现全局快捷键功能利用QxtGlobalShortcut库 0
利用QSS去掉QListWidget选中时的虚线框 0
如何自己使用 QEventLoop解决窗口一闪而过的问题 0
Qt 为什么没有提供跨平台的 sleep 函数? 0
相关主题
打印机USB驱动开发之实现打印服务器 0
Qt利用QLabel组件来显示图片 0
TableView自定义代理QStyledItemDelegate实现ComboBox 0
Qt利用QGraphicsView类实现图片放大缩小平移显示 0
Qt实现非阻塞延迟方法sleep 0
海康相机SDK的C++对应的接口 0
Qt实现webdav客户端功能支持https协议的webdav客户端 0
CHKDSK解决 移动硬盘只能看见盘符其它信息都看不见另外双击也打不开 0
gogs一直报errror:dial tcp xxx.xxx.xxx.xxx 宿主机的ip 0
索鸟快传2.1.2发布 0
索鸟快传2.1.1发布 0
Qt操作windows注册表的方法 bat从注册表中将键值删除 0
重写QSqlQueryModel实现QTableView显示图片 0
QLocalServer基于本地套接字socket的服务端server 0
Qt使用动态库的方法 QLibrary库的典型用法 0
QT实现视频播放器界面开发 0
QTableview实现鼠标放上面显示不同颜色 0
Qt的QTableView自定义委托详解 0
QTableView利用自定义委托实现日期显示下拉菜单文字颜色等 0
Qt利用QApplication::sendEvent和QMouseEvent模拟鼠标点击事件 0