Qt中IPC之一的QLocalSocket和QLocalServer实现了单工与双工通信。在qtdemo中有例子说明,这里作自己的理解实现双工通信的过程。
服务端:
QLocalSocket*m_socket ;
///----------------------------------------------------------------------------------
//初始化Server,监听特定连接
void initServer()
{
QLocalServer* m_server = new QLocalServer(this);//创建服务端
bool a = connect(m_server,SIGNAL(newConnection()), this, SLOT(onNewConnection()));//连接服务端收到的连接信号,即当客户端socket调用connectToServer函数时响应
QLocalServer::removeServer("IPCConnect");//移除服务端已有连接,保证本次监听成功
if (!m_server->listen("IPCConnect"))//监听特定的连接
{
QMessageBox::warning(this,"警告","监听失败!");
}
}
//----------------------------------------------------------------------------------
//新链接影响槽函数,获取发送端socket,设置槽函数影响收到来自发送端socket的信号
void onNewConnection()
{
if (m_server->hasPendingConnections())//如果服务端有一个待处理的连接
{
m_socket = new QLocalSocket(this);//创建一个套接字
m_socket = m_server->nextPendingConnection();//获取连接上的套接字的对象,也就是客户端套接字对象
connect(m_socket,SIGNAL(readyRead()),this,SLOT(OnReadyRead()));//订阅该套接字信号
}
}
//-----------------------------------------------------------------------------------
//收到套接字传过来的信号时响应
void OnReadyRead()
{
QByteArray dataArray = m_socket->readAll();//读取传输所有数据
char* readdata = dataArray.data();//转换数据为char数组
QString str = QString::fromLocal8Bit((const char*)readdata);//转换为字符串
}
//---------------------------------------------------------------------------------
//发送数据到客户端
void SendData(QString data)
{
m_socket->write(strData.toUtf8());//写入
if (!m_socket->waitForBytesWritten())//等待写入是否成功
{
QMessageBox::warning(this,"提示","发送数据失败!");
}
}
注:初始化函数中, QLocalServer::removeServer("IPCConnect");为防止下一步监听失败,先移除一次该连接。
客户端:
QLocalSocket *m_Socket;//用于客户端发送数据的套接字
//--------------------------------------------------------------------------------
void OnInitClient()
{
m_Socket = new QLocalSocket(this);//创建一个套接字
m_Socket->connectToServer("IPCConnect");//尝试连接同名的服务端(前提是客服务端已经初始化完毕)
if(m_Socket->waitForConnected(1000));//等待连接(时常可设置,这里设置1000ms)
{
QMessageBox::warning(this,"警告","连接失败!");
return;
}
bool a = connect(m_Socket,SIGNAL(readyRead()),this,SLOT(OnReceiveMessage()));//响应由服务端使用本套接字发送的数据信号
}
//---------------------------------------------------------------------------------
//响应接收数据
void OnReceiveMessage()
{
QByteArray dataArray = m_Socket->readAll();//读取传输所有数据
char* readdata = dataArray.data();//转换数据为char数组
QString str = QString::fromLocal8Bit((const char*)readdata);//转换为字符串
}
//---------------------------------------------------------------------------------
//发送数据到服务端
void SendData(QString str)
{
m_Socket->write(strData.toUtf8());//写入
if (!m_Socket->waitForBytesWritten())//等待写入是否成功
{
QMessageBox::warning(this,"提示","发送数据失败!");
}
}
服务端和客户端分别初始化完成后,分别调用发送函数即可实现双工了。
//-------------------------------------------------------------------------------------------------------------------------------------
这里只是实现了一个socket套接字的收发,也可以通过多个Socket同时使用,可以在接收端槽函数中通过
QLocalSocket *local = static_cast<QLocalSocket *>(sender()); 获取发送端套接字对象。