在QT編程中有時會用到server服務端與客戶端進行TCP網絡通信,服務端部分代碼如下:
1、創建server用於監聽客戶端套接字
this->server = new QTcpServer(this); this->server->listen(QHostAddress::Any,5001); connect(this->server,SIGNAL(newConnection()),this,SLOT(newConnection()));
2、newConnection()函數
//信號槽函數--新的設備連接 void Widget::newConnection() { //查詢空閑的套接字 for(int i = 0; i<SOCKET_MAXNUM; i++) { if(!this->socketFlag[i]) { this->socketIndex = i; break; } } this->socket[socketIndex] = this->server->nextPendingConnection(); this->socketFlag[socketIndex] = SOCKET_FLAG_CONNECTED; connect(this->socket[socketIndex],SIGNAL(readyRead()),this,SLOT(readData())); scan_Device(); }
3、update_DeviceNetState()函數用於檢測更新socket狀態
//更新設備連接狀態,清理釋放過期的SOCKET void Widget::update_DeviceNetState() { int onlineDeviceNum = getChildItemCount(DEVICE_TB_ONLINE_DEVICE); qDebug()<<"Line-658 當前在線設備數量:"<<onlineDeviceNum; for(int i = 0;i<onlineDeviceNum;i++) { int socketID = ui->DEVICE_TABLE->topLevelItem(DEVICE_TB_ONLINE_DEVICE)->child(i)->data(3,Qt::SocketIndex).toInt(); bool netState = send_WakeHand(socket[socketID]); qDebug()<<"此設備在線? "<<netState; if(netState == STATE_OFFLINE) { clearSocket(socketID); deviceNetStateChange(i,DEVICE_TB_OFFLINE_DEVICE,DEVICE_TB_ONLINE_DEVICE,-1); } } }
4、send_WakeHand(QTcpSocket *currSocket) 發送握手信號返回套接字返回值
//發送握手信號,判斷設備是否掉線 bool Widget::send_WakeHand(QTcpSocket *currSocket) { int ret = currSocket->write("wake hands"); qDebug()<<"ret ="<<ret; if(ret == -1) return STATE_OFFLINE; return STATE_ONLINE; }
5、利用定時器QTimer定時檢查更新套接字狀態
QTimer *timer = new QTimer(this); //定時檢查更新設備的網絡狀態 connect(timer,SIGNAL(timeout()),this,SLOT(update_DeviceNetState())); timer->start(1000);
代碼僅供學習參考,未經允許,禁止轉載