进程通信学习——QLocalSocket和QLocalServer

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()); 获取发送端套接字对象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章