基於QT的TCP通訊TCPServer服務端C++ 代碼開源
本文是TCP服務端,如需客戶端請點擊基於QT的TCP客戶端
Qt是一種基於C++的跨平臺圖形用戶界面應用程序開發框架
本次使用QT的版本是5.6
TCP旨在適應支持多網絡應用的分層協議層次結構。 連接到不同但互連的計算機通信網絡的主計算機中的成對進程之間依靠TCP提供可靠的通信服務。TCP假設它可以從較低級別的協議獲得簡單的,可能不可靠的數據報服務。 原則上,TCP應該能夠在從硬線連接到分組交換或電路交換網絡的各種通信系統之上操作。
可以實現16進制的接收顯示以及16進制的發送。
可同時向所有客戶機發送消息或單獨一臺客戶機發送消息
需要在pro文件添加
QT += network
數據發送
/**
*發送數據用 可發HEX數據
* @brief TcpServer::sendData
* @param client
* @param data
*/
void TcpServer::sendData(QTcpSocket *client,QString data){
//如果發送HEX的選擇框選中 那麼就是需要發送HEX數據
if(ui->ckb_hex_send->isChecked())
{
bool ok;
QByteArray ret;
data = data.trimmed();
data = data.simplified();
QStringList sl = data.split(" ");
foreach (QString s, sl) {
if(!s.isEmpty())
{
char c = s.toInt(&ok,16)&0xFF;
if(ok){
ret.append(c);
}else{
QMessageBox::warning(0,tr("錯誤:"),QString("非法的16進制字符: \"%1\"").arg(s));
}
}
}
client->write(ret);
}
//直接發送字符串
else{
client->write(data.toLocal8Bit());
}
}
數據接收
connect(currentClient,&QTcpSocket::readyRead,[=](){
//遍歷所有客戶端尋找有新數據的客戶端
for(int i=0; i<tcpClient.length(); i++)
{
//讀數據
QByteArray buffer = tcpClient[i]->readAll();
//如果遍歷到當前的客戶端沒有數據就直接跳到下一個
if(buffer.isEmpty()) continue;
static QString IP_Port, IP_Port_Pre;
IP_Port = tr("[%1:%2]:").arg(tcpClient[i]->peerAddress().toString().split("::ffff:")[1])\
.arg(tcpClient[i]->peerPort());
//如果是新的客戶端發消息回來就在接收框輸出一個新的[ip:port]
if(IP_Port != IP_Port_Pre)
ui->re_edit->append(IP_Port);
//檢測是否是HEX顯示
if(ui->ckb_hex_show->isChecked())
{
QString ret(buffer.toHex().toUpper());
int len = ret.length()/2;
for(int j=1;j<len;j++)
{
qDebug()<<j;
ret.insert(2*j+j-1," ");
}
ui->re_edit->append(ret);
}else{
ui->re_edit->append(QString::fromLocal8Bit(buffer));
}
IP_Port_Pre = IP_Port;
}
});
界面:
需要該源碼的可以關注公衆號:智慧小巷
回覆:QT的TCP通訊
即可!