赞
踩
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()); 获取发送端套接字对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。