網站首頁 編程語言 正文
本文實例為大家分享了QT TCP實現簡單通信示例的具體代碼,供大家參考,具體內容如下
TCP服務端:
第一步: 創建監聽套接字的QTcpSever
QTcpServer *m_tsTcpServer;
第二步: listen------監聽是否有新的連接進來
int iMyport;如果有新的客戶端連接的話,會觸發信號newConnection(),定義一個槽函數接收連接好的套接字.
//監聽的端口號
iMyport = iPort;
//判斷是否接收到了新的連接
if(m_tsTcpServer->listen(QHostAddress::Any,iMyport))
? ? {
? ? ? ? connect(m_tsTcpServer,SIGNAL(newConnection()),this,SLOT(slotServerNewConnection()));
? ? }
? ? else
? ? {
? ? ? ? qDebug() << "server listen error";
? ? }
第三步: 取出套接字
QTcpSocket *m_tsTcpSocket; 如果客戶端有消息進來的話,會觸發信號readyRead();斷開連接的話會觸發disconnected();
//獲得連接客戶端的SOCKET套接字
m_tsTcpSocket = m_tsTcpServer->nextPendingConnection();
//獲取對方的IP和端口
QString sIp = m_tsTcpSocket->peerAddress().toString();
quint16 sPort = m_tsTcpSocket->peerPort();
qDebug() << sIp << sPort;
connect(m_tsTcpSocket,SIGNAL(readyRead()),this,SLOT(slotServerReadData()));
connect(m_tsTcpSocket, SIGNAL(disconnected()), this, SLOT(slotServerDisConnection()));
第四步: 讀取套接字的內容
//從socket中讀出數據
QByteArray baArray = m_tsTcpSocket->readAll();
QString sMsg = baArray;
到此服務端簡單的通信搭建就完成了.
TCP客戶端:
第一步: 創建套接字,與服務端的IP地址和端口號連接.注:這里的端口號和上面服務端綁定的那個端口號是一樣的,別搞錯了.
//連接服務端
m_tsTcpSocket->connectToHost(sIP,iPort);
//成功連接返回true,錯誤返回false
if(m_tsTcpSocket->waitForConnected())
? ? {
? ? ? ? qDebug() << "connect success";
? ? }
? ? //成功連接會觸發槽函數 如果在找在這個槽函數里寫write的話只能寫一次,所以可以等連接成功后自己把寫的函數放在自己想要發送的模塊
? ? //connect(m_tsTcpSocket,SIGNAL(connected()),this,SLOT(slotConnectedSuccess()));
第二步: 連接成功后就可以直接向服務端發消息了.
QString str;
int iSize = m_tsTcpSocket->write(str.toUtf8().data());//返回字節的大小
//等待write寫完再寫下一次的write
? ? if(!m_tsTcpSocket->waitForBytesWritten(50000))
? ? {
? ? ? ? return;
? ? }
? ? //判斷發送是否成功
? ? if(iSize ==-1)
? ? {
? ? ? ? qDebug() << "write error";
? ? ? ? return;
? ? }
到此客戶端的簡單通信就搭建好了.
若要多次向服務端發消息,可以while循環或者是其他.在這里要注意如果要多次發消息的話,waitForBytesWritten()這個函數是必不可少的,不然多次的話可能通信會失敗.
注:write()函數和被觸發的讀的readyRead()信號并不是一一對應的,比如可能你客戶端write了三次,服務端那邊的readyRead可能才被觸發一次.
想要了解詳細的原因可以自己再去了解.
同理服務端向客服端發消息的話直接發送就可,服務端要收消息的話也是直接讀就好,因為連接已經成功了.
相信小聰明腦袋瓜的你能懂的.
補充:客戶端主動斷開服務的連接
void TcpClient::disConnectSever()
{
? ? //方式一
? ? m_tcpSocket->flush();
? ? m_tcpSocket->disconnectFromHost();
? ??
? ? //方式二
? ? m_tcpSocket->abort();
}
注:方式二abort與方式一的區別:abort中止當前連接并重置套接字。與disConnectFromHost()不同,該函數會立即關閉套接字,丟棄寫緩沖區中的所有掛起數據。
原文鏈接:https://blog.csdn.net/ligare/article/details/122696904
相關推薦
- 2023-04-24 一文帶你深入了解C++中音頻PCM數據_C 語言
- 2023-05-13 python中flatten()函數用法詳解_python
- 2022-10-21 React?模式之純組件使用示例詳解_React
- 2023-03-26 C#連接藍牙設備的實現示例_C#教程
- 2022-06-15 C++詳細講解繼承與虛繼承實現_C 語言
- 2022-11-14 Swift?指針底層探索分析_Swift
- 2022-10-20 初識Android?PowerManagerService省電模式_Android
- 2022-05-12 Kotlin map 高級函數返回新的集合
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支