在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)
{
}
QLocalServer与QLocalSocket进程通讯,布布扣,bubuko.com
QLocalServer与QLocalSocket进程通讯
原文:http://www.cnblogs.com/lvdongjie/p/3746928.html