檔案網(wǎng)站建設(shè)思考北京seo多少錢
同時(shí)實(shí)現(xiàn)了QTcpSocket、QWebSocket和QLocalSocket的簡(jiǎn)單通訊deamon,支持自動(dòng)獲取本機(jī)ip,多個(gè)客戶端交互。在這個(gè)基礎(chǔ)上你可以自己加錯(cuò)誤檢測(cè)、心跳發(fā)送、包封裝解析和客戶端自動(dòng)重連等功能。
獲取本機(jī)電腦ip:
QString Widget::getIp()
{QString hostName=QHostInfo::localHostName();//主機(jī)信息查詢:返回本機(jī)主機(jī)名QHostInfo hostInfo=QHostInfo::fromName(hostName);//通過主機(jī)名稱,獲取IP地址,返回一個(gè)hostInfo類QString localIP="";//本地IP地址string數(shù)組QList<QHostAddress> addList=hostInfo.addresses();//創(chuàng)建一個(gè)QList對(duì)象,容器內(nèi)部存儲(chǔ)QHostAddress類型的數(shù)據(jù),返回一個(gè)address數(shù)組,QHostAddress類提供一個(gè)IP地址的信息,包括IPv4和Ipvif (!addList.isEmpty()){for (int i=0;i<addList.count();i++){QHostAddress aHost=addList.at(i);//訪問指定位置的元素//測(cè)試//qDebug()<<aHost.toString();if (QAbstractSocket::IPv4Protocol==aHost.protocol()) //protocol()返回IP地址的協(xié)議類型,并且只返回IPv4的地址{localIP=aHost.toString();//返回IP地址的字符串break;}}}qDebug()<<localIP;return localIP;
}
tcp服務(wù)器連接介紹:
1、定義并創(chuàng)建接收的信號(hào)與槽:
//創(chuàng)建tcp服務(wù)器對(duì)象
m_tcpServer = new QTcpServer(this);
//捕獲客戶端連接
connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(slottcpNewConnection()));
2、開啟監(jiān)聽ip和端口
m_tcpServer->listen(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());
3、接入連接進(jìn)來的客戶端,并配置接收。
//獲取新的連接對(duì)象QTcpSocket *tcpSocket = m_tcpServer->nextPendingConnection();//捕獲客戶端發(fā)送數(shù)據(jù)的信號(hào)connect(tcpSocket,&QTcpSocket::readyRead,this,[&](){QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());QString val = socket->readAll();});//捕獲客戶端斷開的信號(hào)connect(tcpSocket,&QTcpSocket::disconnected,this,[=](){});
}
4、發(fā)送數(shù)據(jù)
tcpSocket->write(ui->tcpsendedit->text().toLatin1());
tcp客戶端連接流程
1、定義并連接ip和端口
m_tcpSocket = new QTcpSocket(this);m_tcpSocket->connectToHost(QHostAddress(ui->tcpip->text()),ui->tcpport->text().toInt());
2、綁定連接、斷開連接和接收的信號(hào)與槽
connect(m_tcpSocket,&QTcpSocket::connected,this,[=](){});connect(m_tcpSocket,&QTcpSocket::disconnected,this,[=](){});connect(m_tcpSocket,&QTcpSocket::readyRead,this,&Widget::slotTcpReadData);
3、發(fā)送
m_tcpSocket->write(ui->tcpsendedit->text().toLatin1());
websocket服務(wù)器連接流程
1、定義并創(chuàng)建接收的信號(hào)與槽:
//使用給定的serverName構(gòu)造一個(gè)新的QWebSocketServer。該服務(wù)器名稱將在HTTP握手階段被用來識(shí)別服務(wù)器。它可以為空,此時(shí)不會(huì)將服務(wù)器名稱發(fā)送給客戶端。//SslMode指示服務(wù)器是通過wss(SecureMode)還是ws(NonSecureMode)運(yùn)行。QWebSocketServer::SecureMode服務(wù)器以安全模式運(yùn)行(通過wss);QWebSocketServer::NonSecureMode服務(wù)器以非安全模式運(yùn)行(通過ws)m_webServer = new QWebSocketServer("",QWebSocketServer::NonSecureMode,this);connect(m_webServer,SIGNAL(newConnection()),this,SLOT(slotWebNewConnect()));
2、開啟監(jiān)聽ip和端口
m_webServer->listen(QHostAddress(ui->webip->text()),ui->webport->text().toInt());
3、接入連接進(jìn)來的客戶端,并配置接收。
QWebSocket* webSocket = m_webServer->nextPendingConnection();connect(webSocket,&QWebSocket::disconnected,this,[=](){});connect(webSocket,&QWebSocket::textMessageReceived,this,[=](QString val){});
4、發(fā)送數(shù)據(jù)
webSocket>sendTextMessage(ui->websendedit->text());//sendBinaryMessage發(fā)送二進(jìn)制數(shù)據(jù)。
websocket客戶端連接流程
1、定義并連接ip和端口
m_webSocket = new QWebSocket("");m_webSocket->open(QUrl(QString("ws://%1:%2").arg(ui->webip->text()).arg(ui->webport->text())));
2、綁定連接、斷開連接和接收的信號(hào)與槽
connect(m_webSocket,&QWebSocket::connected,this,[=](){});connect(m_webSocket,&QWebSocket::disconnected,this,[=](){});connect(m_webSocket,&QWebSocket::textMessageReceived,this,&Widget::slotwebReadData);
3、發(fā)送
m_webSocket->sendTextMessage(ui->websendedit->text());//sendBinaryMessage發(fā)送二進(jìn)制數(shù)據(jù)。
本地通信服務(wù)器連接流程
1、定義并創(chuàng)建接收的信號(hào)與槽:
//創(chuàng)建本地服務(wù)器對(duì)象m_localServer = new QLocalServer(this);//捕獲客戶端連接connect(m_localServer,SIGNAL(newConnection()),this,SLOT(slotlocalnewConnection()));
2、開啟監(jiān)聽key值
QLocalServer::removeServer(m_oldKey); //刪除已有的連接m_localServer->listen(ui->localkey->text()); //監(jiān)聽客戶端m_oldKey = ui->localkey->text();
3、接入連接進(jìn)來的客戶端,并配置接收。
if (m_localServer->hasPendingConnections()){//獲取新的連接對(duì)象QLocalSocket* localSocket = m_localServer->nextPendingConnection();//捕獲客戶端發(fā)送數(shù)據(jù)的信號(hào)connect(localSocket,&QLocalSocket::readyRead,this,[&](){QLocalSocket* socket = qobject_cast<QLocalSocket*>(sender());QString val = socket->readAll();});//捕獲客戶端斷開的信號(hào)connect(localSocket,&QLocalSocket::disconnected,this,[=](){});}
4、發(fā)送
localSocket->write(ui->tcpsendedit->text().toLatin1());
本地通信客戶端連接流程
1、定義并連接key值
m_localSocket = new QLocalSocket(this);m_localSocket->connectToServer(ui->localkey->text(),QIODevice::ReadWrite);
2、綁定連接、斷開連接和接收的信號(hào)與槽
connect(m_localSocket,&QLocalSocket::connected,this,[=](){});connect(m_localSocket,&QLocalSocket::disconnected,this,[=](){});connect(m_localSocket,&QLocalSocket::readyRead,this,&Widget::slotlocalReadData);
3、發(fā)送
m_localSocket->write(ui->localsendedit->text().toLatin1());
完整示例代碼