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()); 獲取發送端套接字對象。