Qt下TCP程式設計

2022-03-15 17:42:35 字數 2254 閱讀 6923

一、伺服器

1、宣告乙個qtcpserver物件

qtcpserver* serverlistener;

2、new出物件

this->serverlistener = new qtcpserver();

3、伺服器監聽

qhostaddress ipaddress(「192.168.1.1」);

quint16 ipport = 8080;

serverlistener->listen(ipaddress,ipport);

4、宣告乙個qlist物件用於存客戶端

qlistclientlist;

5、連線訊號與槽

qobject::connect(this->serverlistener,signal(newconnection()),this,slot(newconnection()));//newconnection是自定義槽函式,用於管理clientlist列表

6、實現newconnection函式,儲存客戶端至clientlist

void tcpserver::newconnection()

qtcpsocket* serverclient = this->serverlistener->nextpendingconnection();//new出客戶端物件

qobject::connect(serverclient,signal(readyread()),this,slot(rcvdata()));//當此客戶端有資料時在自定義rcvdata函式裡接收

qobject::connect(serverclient,signal(disconnected()),this,slot(removeclient()));//當此客戶端斷開連線時,會發出disconnected訊號,在自定義removeclient裡去除客戶端

7、實現removeclient函式,去除客戶端

void tcpserver::removeclient()

for(int i=0;iclientlist.length();i++)

if(clientlist.at(i)->socketdescriptor() == -1)//用於判斷當前客戶端是否有效

clientlist.removeat(i);

8、實現rcvdata函式,接收資料

void tcpserver::rcvdata()

qbytearray ba;

for(int i=0;iclientlist.length();i++)

9、傳送資料

clientlist.at(n)->write(qbytearray ba);

10、停止

serverlistener->close();

二、客戶端

1、宣告乙個qtcpsocket物件

qtcpsocket* tcpclient;

2、new出物件

this->tcpclient = new qtcpsocket();

3、連線伺服器,連線訊號與槽

tcpclient->connecttohost("192.168.1.1","8080");

qobject::connect(this->tcpclient,signal(readyread()),this,slot(rcvdata()));//rcvdata是自定義接收槽函式

4、實現rcvdata函式,接收資料

void tcpclient::rcvdata()

qbytearray ba = tcpclient->readall();

5、傳送資料

tcpclient->write(qbytearray ba);

6、關閉

tcpclient->close();

ps:軟體開發流程

ps:1、在一次編寫tcp伺服器過程中,用tcp來listen電腦的ip,發現總是listen沒有報錯,但是用小黃人總是連線不上。

原來電腦有多個ip,比如區域網ip、127那個預設ip、虛擬機器ip,電腦會有乙個ip的優先順序排序,如果上面listen的ip不是電腦優先順序最高那個,就會出現這樣的問題。

解決:1、把其他ip禁掉  2、修改電腦ip優先順序

2、設定不快取傳送,這樣可以不沾包

if(sendba.size() ==tcpclient.write(sendba))

原理就是在傳送之後立即呼叫flush

Qt下TCP程式設計

一 伺服器 1 宣告乙個qtcpserver物件 qtcpserver serverlistener 2 new出物件 this serverlistener new qtcpserver 3 伺服器監聽 qhostaddress ipaddress 192.168.1.1 quint16 ippo...

Qt下Tcp傳輸檔案

ifndef serverwidget h define serverwidget h include include 監聽套接字 include 通訊套接字 include include namespace ui class serverwidget public qwidget endif s...

QT基於tcp協議網路程式設計

基於qt網路程式設計 基於tcp協議 c s模式程式設計 所需要的類 qtcpserver qtcpsocket 利用qt基於tcp協議編寫c s模式程式 兩個類中的訊號 qtcpserver newconnection qtcpsocket readyread connected disconne...