zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/11063583.html
Copyright © 2011-2022 走看看