Qt网络编程——TCP服务器与客户端互发信息
生活随笔
收集整理的這篇文章主要介紹了
Qt网络编程——TCP服务器与客户端互发信息
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
前一個(gè)博客,試了TCP的服務(wù)器與客戶端的連接與斷開,接下就是客戶端與服務(wù)器互發(fā)信息。
客戶端
1.往服務(wù)器發(fā)送信息
//發(fā)送消息 void Client::on_buttonSendMessage_clicked() {QString data = ui->textEditInput->toPlainText();if(data.length() != 0){tcpClient->write(data.toLatin1());ui->textEditInput->clear();ui->textEditStatus->append("發(fā)送文本消息成功!");data.clear();}else{ui->textEditStatus->append("不能發(fā)送空的消息!");}}當(dāng)客戶端連接上服務(wù)器之后,在輸入窗口下輸入文字(英文),然后點(diǎn)發(fā)送按鍵,信息往服務(wù)器發(fā)送。
2.接收來自服務(wù)器的信息
2.1 在構(gòu)造函數(shù)里添加一個(gè)槽函數(shù)做接收到信息的事件響應(yīng)
2.1 實(shí)現(xiàn)這個(gè)槽函數(shù),接收信息并顯示出來
//接收服務(wù)器端的信息并顯示 void Client::readServerMessage() {QByteArray buffer = tcpClient->readAll();if(!buffer.isEmpty()){ui->textEditAccept->append(buffer);} }服務(wù)器
1.在服務(wù)器要加上有新客戶端連接時(shí)的槽函數(shù)
//有新的連接時(shí)的槽函數(shù)connect(tcpServer,SIGNAL(newConnection()),this, SLOT(newConnectionSlot()));槽函數(shù)實(shí)現(xiàn)
//有新客戶端連接時(shí) void Server::newConnectionSlot() {//返回套接字指針currentClient = tcpServer->nextPendingConnection();tcpClient.append(currentClient);ui->comboBoxIP->addItem(tr("%1:%2").arg(currentClient->peerAddress().toString().split("::ffff:")[1])\.arg(currentClient->peerPort()));//讀取消息處理connect(currentClient, SIGNAL(readyRead()), this, SLOT(readMessageData())); }2.接收來自客戶端的信息并顯示出來
//接收消息并顯示到界面 void Server::readMessageData() {for(int i = 0; i < tcpClient.length(); i++){QByteArray buffer = tcpClient.at(i)->readAll();if(buffer.isEmpty()){ui->textEditStatus->append("接收的消息為空!");}else{ui->textEditAccept->append(buffer);ui->textEditStatus->append("接收消息成功!");}} }3.往客戶端發(fā)送信息,這里有兩種可能,一是只要連接上的客戶端都發(fā),二是指定客戶端來發(fā)送,就是綁死客戶端的IP地址。
//往客戶端發(fā)送信息 void Server::on_buttonSendMessage_clicked() {QString input_data = ui->textEditInput->toPlainText();if(input_data.isEmpty()){ui->textEditStatus->append("不能發(fā)送空的信息!");return;}//如果選擇全部發(fā)送信息if(ui->comboBoxIP->currentIndex() == 0){for(int i = 0; i < tcpClient.length(); i++){tcpClient.at(i)->write(input_data.toLatin1());ui->textEditStatus->append("信息發(fā)送成功!");ui->textEditInput->clear();input_data.clear();}}//指定接收的客戶端else{//得到選擇的IP地址QString client_IP = ui->comboBoxIP->currentText().split(":").at(0);//得到端口int client_port = ui->comboBoxIP->currentText().split(":").at(1).toInt();//遍歷連接到的客戶端for(int i = 0; i < tcpClient.length(); i++){if(tcpClient[i]->peerAddress().toString().split("::ffff:")[1]==client_IP\&& tcpClient[i]->peerPort()==client_port){tcpClient.at(i)->write(input_data.toLatin1());ui->textEditStatus->append("發(fā)送信息到:"+client_IP+"成功!");//ui->textEditInput->clear();input_data.clear();return; //ip:port唯一,無需繼續(xù)檢索}}} }測(cè)試
運(yùn)行服務(wù)器與客戶端,并點(diǎn)擊監(jiān)聽與連接,開始互發(fā)信息
運(yùn)行效果如下:
以上是就是一個(gè)服務(wù)器與客戶端的初步框架,還缺少了互相傳送圖像,上傳下載文件這兩個(gè)功能,還有異常處理機(jī)制,心跳檢測(cè),多線程等需要完善。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Qt网络编程——TCP服务器与客户端互发信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 身份证识别——iOS端实现身份证检测
- 下一篇: Qt网络编程——使用OpenCV与TCP