• QLocalServer与QLocalSocket进程通讯


    在Qt中,提供了多种IPC方法,作者所用的是QLocalServer和QLocalSocket。看起来好像和Socket搭上点边,实则底层是windows的name pipe。这应该是支持双工通信的。
     
    一 QLocalServer
     
    #ifndef VXMAINWINDOW_H
    #define VXMAINWINDOW_H
    #include <QWidget>
    #include <QtNetwork/QLocalServer>
    #include <QtNetwork/QLocalSocket>
    class QPushButton;
    class QTextEdit;
    class CVxMainWindow : public QWidget
    {
     Q_OBJECT
    public:
     CVxMainWindow(QWidget *parent=NULL);
     ~CVxMainWindow();
    protected:
     void resizeEvent(QResizeEvent *);
    private slots:
     void Btn_ListenClickedSlot();
     void Btn_StopListenClickedSlot();
     void newConnectionSlot();
     void dataReceived();
    private:
     QLocalServer *m_pServer;
     QLocalSocket *m_pSocket;
     QPushButton *m_pBtn_Listen;
     QPushButton *m_pBtn_StopListen;
     QTextEdit   *m_pEdt_Info;
    };
    #endif // VXMAINWINDOW_H
    #include "VxMainWindow.h"
    #include <QtGui/QtGui>
    CVxMainWindow::CVxMainWindow(QWidget *parent)
     : QWidget(parent)
    {
     m_pBtn_Listen     = new QPushButton(QObject::tr("开始监听"), this);
     m_pBtn_StopListen = new QPushButton(QObject::tr("停止监听"), this);
     m_pEdt_Info       = new QTextEdit(this);
     m_pServer         = new QLocalServer(this);
     connect(m_pBtn_Listen,     SIGNAL(clicked()), this, SLOT(Btn_ListenClickedSlot()));
     connect(m_pBtn_StopListen, SIGNAL(clicked()), this, SLOT(Btn_StopListenClickedSlot()));
     connect(m_pServer,         SIGNAL(newConnection()), this, SLOT(newConnectionSlot()));
    }
    CVxMainWindow::~CVxMainWindow()
    {
    }
    void CVxMainWindow::resizeEvent(QResizeEvent *)
    {
     m_pBtn_Listen->setGeometry(10, 5, 80, 20);
     m_pBtn_StopListen->setGeometry(100, 5, 80, 20);
     m_pEdt_Info->setGeometry(0, 30, width(), height() - 30);
    }
    void CVxMainWindow::Btn_ListenClickedSlot()
    {
     if (!m_pServer->isListening())
     {
      if (m_pServer->listen(QObject::tr("AAA"))) 
      {
       m_pEdt_Info->append(QObject::tr("打开监听端口成功!"));
      }
      else
      {
       m_pEdt_Info->append(QObject::tr("打开监听端口失败!"));
      }
     }
     else
     {
      m_pEdt_Info->append(QObject::tr("正在监听中...!"));
     }
    }
    void CVxMainWindow::Btn_StopListenClickedSlot()
    {
     if (m_pServer->isListening())
     {
      m_pServer->close();
      m_pEdt_Info->append(QObject::tr("停止监听!"));
     }
    }
    void CVxMainWindow::newConnectionSlot()
    {
     m_pEdt_Info->append(QObject::tr("有新客户端连接到服务器"));
     m_pSocket = m_pServer->nextPendingConnection();
     connect(m_pSocket, SIGNAL(disconnected()), m_pSocket, SLOT(deleteLater()));
     connect(m_pSocket, SIGNAL(readyRead()),this, SLOT(dataReceived()));
     int length = 0;
     QString vMsgStr = QObject::tr("Welcome");
     if((length=m_pSocket->write(vMsgStr.toLatin1(),vMsgStr.length()))!=vMsgStr.length())
     {
     }
    }
    void CVxMainWindow::dataReceived()
    {
     while(m_pSocket->bytesAvailable())
     {       
      QString vTemp;
      vTemp = m_pSocket->readLine();          
      m_pEdt_Info->append(vTemp);
      int length = 0;
      QString vMsgStr = QObject::tr("回复:") + vTemp;
      if((length=m_pSocket->write(vMsgStr.toLatin1(),vMsgStr.length()))!=vMsgStr.length())
      {
      }
     }
    }
     
    二 QLocalSocket
     
    #ifndef VXMAINWINDOW_H
    #define VXMAINWINDOW_H
    #include <QWidget>
    #include <QtNetwork/QLocalSocket>
    class QPushButton;
    class QTextEdit;
    class QLineEdit;
    class CVxMainWindow : public QWidget
    {
     Q_OBJECT
    public:
     CVxMainWindow(QWidget *parent=NULL);
     ~CVxMainWindow();
    protected:
     void resizeEvent(QResizeEvent *);
     private slots:
      void Btn_ConnectClickedSlot();
      void Btn_DisConnectClickedSlot();
      void Btn_SendClickedSlot();
      void connectedSlot();
      void disconnectedSlot();
      void dataReceived();
      void displayError(QAbstractSocket::SocketError);
    private:
     QLocalSocket *m_pSocket;
     QPushButton *m_pBtn_Connect;
     QPushButton *m_pBtn_DisConnect;
     QTextEdit   *m_pEdt_Info;
     QLineEdit   *m_pEdt_Send;
     QPushButton *m_pBtn_Send;
    };
    #endif // VXMAINWINDOW_H
    #include "VxMainWindow.h"
    #include <QtGui/QtGui>
    CVxMainWindow::CVxMainWindow(QWidget *parent)
     : QWidget(parent)
    {
     m_pBtn_Connect    = new QPushButton(QObject::tr("连接服务器"), this);
     m_pBtn_DisConnect = new QPushButton(QObject::tr("断开连接"), this);
     m_pEdt_Send       = new QLineEdit(this);
     m_pBtn_Send       = new QPushButton(QObject::tr("发送"), this);
     m_pEdt_Info = new QTextEdit(this);
     m_pSocket = new QLocalSocket(this);
     connect(m_pBtn_Connect,    SIGNAL(clicked()), this, SLOT(Btn_ConnectClickedSlot()));
     connect(m_pBtn_DisConnect, SIGNAL(clicked()), this, SLOT(Btn_DisConnectClickedSlot()));
     connect(m_pBtn_Send,       SIGNAL(clicked()), this, SLOT(Btn_SendClickedSlot()));
     connect(m_pSocket, SIGNAL(connected()), this, SLOT(connectedSlot()));
     connect(m_pSocket, SIGNAL(disconnected()), this, SLOT(disconnectedSlot()));
     connect(m_pSocket, SIGNAL(readyRead()),this, SLOT(dataReceived()));
     connect(m_pSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
    }
    CVxMainWindow::~CVxMainWindow()
    {
    }
    void CVxMainWindow::resizeEvent(QResizeEvent *)
    {
     m_pBtn_Connect->setGeometry(10, 5, 80, 20);
     m_pBtn_DisConnect->setGeometry(100, 5, 80, 20);
     m_pEdt_Send->setGeometry(10, 30, 150, 20);
     m_pBtn_Send->setGeometry(170, 30, 80, 20);
     m_pEdt_Info->setGeometry(0, 60, width(), height() - 60);
    }
    void CVxMainWindow::Btn_ConnectClickedSlot()
    {
     m_pSocket->connectToServer(QObject::tr("AAA"));
    }
    void CVxMainWindow::Btn_DisConnectClickedSlot()
    {
     m_pSocket->disconnectFromServer();
    }
    void CVxMainWindow::Btn_SendClickedSlot()
    {
     int length = 0;
     QString vMsgStr = m_pEdt_Send->text();
     if((length=m_pSocket->write(vMsgStr.toLatin1(),vMsgStr.length()))!=vMsgStr.length())
     {
      m_pEdt_Info->append(QObject::tr("发送信息失败:") + vMsgStr);
     }
    }
    void CVxMainWindow::connectedSlot()
    {
     m_pEdt_Info->append(QObject::tr("成功连接到服务器!"));
    }
    void CVxMainWindow::disconnectedSlot()
    {
     m_pEdt_Info->append(QObject::tr("断开与服务器的连接!"));
    }
    void CVxMainWindow::dataReceived()
    {
     while(m_pSocket->bytesAvailable())
     {       
      QString vTemp;
      vTemp = m_pSocket->readLine();          
      m_pEdt_Info->append(vTemp);
     }
    }
    void CVxMainWindow::displayError(QAbstractSocket::SocketError)
    {
    }
  • 相关阅读:
    文件夹对比工具
    删除eval key
    Mongodb Backup and Restore
    RabbitMQ Management界面中查看NaN的队列
    css文字描边
    网页适配 iPhoneX,就是这么简单
    VSCode 配置使用less转成.min.css压缩
    css3随着外层包裹的旋转里面的图标为正
    安装nginx+免费https证书
    在线微博数据可视化
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3746928.html
Copyright © 2020-2023  润新知