91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用QT?TCP實現簡單的通信

發布時間:2022-08-23 17:43:30 來源:億速云 閱讀:150 作者:iii 欄目:開發技術

本篇內容主要講解“怎么使用QT TCP實現簡單的通信”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么使用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()不同,該函數會立即關閉套接字,丟棄寫緩沖區中的所有掛起數據。

到此,相信大家對“怎么使用QT TCP實現簡單的通信”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乌珠穆沁旗| 和政县| 长乐市| 武安市| 红安县| 常山县| 萍乡市| 政和县| 张北县| 白水县| 宣恩县| 杨浦区| 微博| 慈利县| 忻州市| 津市市| 隆德县| 宁海县| 道孚县| 银川市| 额尔古纳市| 天峻县| 曲周县| 苏尼特左旗| 吴堡县| 墨竹工卡县| 宁河县| 海门市| 康平县| 景谷| 札达县| 武汉市| 德惠市| 巴彦淖尔市| 射阳县| 中卫市| 湘潭县| 新疆| 东港市| 泾阳县| 临沂市|