QLocalSocket
QIODevice做为QLocalSocket的父类
在Qt中,提供了多种IPC方法。看起来好像和Socket搭上点边,实则底层是windows的name pipe。这应该是支持双工通信的
QLocalServer提供了一种基于本地套接字的服务器,实现了接收本地socket的连接的功能。
通过调用listen()监听特定的连接,每次与client连接上时发出newConnection()信号。
通过调用nextPendingConnection()响应一个等待中的连接请求,返回一个指针,指向用于与client建立通信的QLocalSocket。
当连接发生错误时,serverError() 返回错误的类型,通过调用errorString()可以获取错误描述。
监听过程中,serverName()可获取当前服务器的名称。
调用close()停止对连接请求的监听。
虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。
没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
服务器
#ifndef SERVER_H #define SERVER_H #include <QWidget> #include <QObject> #include <QLocalSocket> #include <QLocalServer> class CServer : public QObject { Q_OBJECT public: CServer() : m_server(NULL) { m_server = new QLocalServer; connect(m_server, SIGNAL(newConnection()), SLOT(serverNewConnectionHandler())); } ~CServer() { m_server->close(); delete m_server; } void RunServer() { qDebug() << "Run Server ok"; QLocalServer::removeServer("ServerName"); bool ok = m_server->listen("ServerName"); if (!ok) { // TODO: } } private slots: void serverNewConnectionHandler() { qDebug() << "New Connection"; qDebug() << "listen: " << m_server->serverName(); QLocalSocket* socket = m_server->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler())); connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); } void socketReadyReadHandler() { QLocalSocket* socket = static_cast<QLocalSocket*>(sender()); if (socket) { QTextStream stream(socket); qDebug() << "Read Data From Client:" << stream.readAll(); QString response = "Hello Client"; socket->write(response.toUtf8()); socket->flush(); } // 返回到客户端的void sendMessage 方法,m_socket->waitForReadyRead()之后的操作 } private: QLocalServer *m_server; }; #endif // SERVER_H #include "server.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); CServer server; server.RunServer(); return a.exec(); }
客户端
#ifndef CLIENT_H #define CLIENT_H #include <QObject> #include <QLocalSocket> #include <QLocalServer> class CClient : public QObject { Q_OBJECT public: CClient() : m_socket(NULL) { m_socket = new QLocalSocket(); connect(m_socket, SIGNAL(connected()), SLOT(socketConnectedHandler())); connect(m_socket, SIGNAL(disconnected()), SLOT(socketDisConnectedHandler())); connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), SLOT(socketErrorHandler(QLocalSocket::LocalSocketError))); } ~CClient() { m_socket->disconnectFromServer(); delete m_socket; } public: void ConnectToServer(const QString &strServerName) { // serverNewConnectionHandler 成员方法将被调用 m_socket->connectToServer(strServerName); if (m_socket->waitForConnected()) { // TODO: } } void sendMessage(const QString &msg) { m_socket->write(msg.toStdString().c_str()); m_socket->flush(); if (!m_socket->bytesAvailable()) m_socket->waitForReadyRead(); QTextStream stream(m_socket); QString respond = stream.readAll(); qDebug() << "Read Data From Server:" << respond; } private slots: void socketConnectedHandler() { qDebug() << "connected."; } void socketDisConnectedHandler() { qDebug() << "disconnected."; } void socketErrorHandler(QLocalSocket::LocalSocketError error) { qWarning() << error; } private: QLocalSocket *m_socket; }; #endif // CLIENT_H #include "client.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); CClient client; client.ConnectToServer("ServerName"); client.sendMessage("Hellow Server"); return a.exec(); }
学习地址https://blog.csdn.net/yhc166188/article/details/80756448
分类:
Qt系列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗