進程通信學習——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()); 獲取發送端套接字對象。

 

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