天天看點

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket



1

建立一個項目:tcpserver.pro

修改tcpserver.pro,注意:如果是想使用網絡庫,需要加上network

sources

+=

\

tcpserver.cpp

tcpclient.cpp

headers

tcpserver.h

tcpclient.h

qt

gui widgets

network

config

c++11

b

建立如下檔案,因為要用到網絡庫,是以加上network

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket

c

編寫ip選擇下拉選,頭檔案chooseinterface.h

#ifndef

chooseinterface_h

#define

#include

<qdialog>

<qcombobox>

class

chooseinterface

:

public

qdialog

{

q_object

public:

explicit

chooseinterface(qwidget

*parent

= 0);

qcombobox*

_combobox;

 qstring

_strselect;

signals:

slots:

void

slotcomboboxchange(qstring);

};

#endif

//

編寫chooseinterface.cpp

"chooseinterface.h"

<qnetworkinterface>

<qvboxlayout>

chooseinterface::chooseinterface(qwidget

*parent)

qdialog(parent)

/*

get

all

interface

*/

qlist<qhostaddress>

addrlist

=

qnetworkinterface::alladdresses();

#if

qlist<qnetworkinterface>

inflist =

qnetworkinterface::allinterfaces();

qlist<qnetworkaddressentry>

entrylist =

inflist.at(0).addressentries();

entrylist.at(0).broadcast()

//編寫一個下拉選

_combobox

new

qcombobox;

qvboxlayout*

lay

qvboxlayout(this);

lay->addwidget(_combobox);

foreach(qhostaddress

addr,

addrlist)

//将位址都轉換成為ipv4的位址

quint32

ipaddr

addr.toipv4address();

//去掉0的ip

if(ipaddr

==

0)

continue;

//在combobox中添加下拉選

_combobox->additem(qhostaddress(ipaddr).tostring());

}

//當下拉選發生變化時的操作

connect(_combobox,

signal(currentindexchanged(qstring)),

this,

slot(slotcomboboxchange(qstring)));

chooseinterface::slotcomboboxchange(qstring

str)

this->_strselect

str;

上面的運作結果是:

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket

編寫tcpserver.h

tcpserver_h

<qwidget>

<qtcpserver>

<qtcpsocket>

<qtextbrowser>

tcpserver:public

qwidget

tcpserver(qwidget

qtcpserver*

_server;

qtcpsocket*

_socket;

qtextbrowser*

_show;

slotnetconnection();

slotreadyread();

編寫tcpserver.cpp

"tcpserver.h"

<qhboxlayout>

<qmessagebox>

tcpserver::tcpserver(qwidget

qwidget(parent)

建立伺服器并監聽

_server

qtcpserver;

  chooseinterface

dlg;

dlg.exec();

//消息提示框

qmessagebox::information(null,"you

select

the

ip:",

dlg._strselect);

_server->listen(qhostaddress(dlg._strselect),

9988);

當有用戶端來連接配接時,調用slotnetconnection方法

connect(_server,

signal(newconnection()),

slot(slotnetconnection()));

_show

qtextbrowser;

qhboxlayout*

qhboxlayout(this);

lay->addwidget(_show);

tcpserver::slotnetconnection()

判斷是否有未處理的連接配接

while(_server->haspendingconnections())

調用nextpeddingconnection去獲得連接配接的socket

_socket

_server->nextpendingconnection();

_show->append("new

connection

....");

為新的socket提供槽函數,來接收資料

connect(_socket,

signal(readyread()),

  this,

slot(slotreadyread()));

tcpserver::slotreadyread()

接收資料,判斷是否有資料,如果有,通過readall函數擷取所有資料

while(_socket->bytesavailable()

>

_show->append("data

arrived

.....

");

qbytearray

buf

_socket->readall();

_show->append(buf);

編寫tcpclient.h

tcpclient_h

<qlineedit>

tcpclient:public

tcpclient(qwidget

  qtcpsocket*

qlineedit*

_lineedit;

slotbuttonclick();

編寫tcpclient.cpp

"tcpclient.h"

<qpushbutton>

tcpclient::tcpclient(qwidget

*parent):

qtcpsocket(this);

_socket->connecttohost("127.0.0.1",

_lineedit

qlineedit;

lay->addwidget(_lineedit);

qpushbutton*

button

qpushbutton("send");

lay->addwidget(button);

connect(button,

signal(clicked()),

slot(slotbuttonclick()));

connect(_lineedit,

signal(returnpressed()),

tcpclient::slotbuttonclick()

qstring

strtext

_lineedit->text();

if(strtext.isempty())

return;

_socket->write(strtext.toutf8());

_lineedit->clear();

mywidget.h

mywidget_h

mywidget

mywidget(qwidget

mywidget.cpp

"mywidget.h"

<qapplication>

mywidget::mywidget(qwidget

int

main(int

argc,char**

argv)

qapplication

app(argc,argv);

tcpserver

s;

s.show();

tcpclient

c;

c.show();

s.setwindowtitle("server");

c.setwindowtitle("client");

return

app.exec();

運作結果:

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket
5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket

編寫udp程式

udpserver.pro

udp1.h

udp2.h

udp1.cpp

udp2.cpp

udp1_h

<qudpsocket>

udp1

udp1(qwidget

qudpsocket*

_udp;

"udp1.h"

<qtimer>

<qdatetime>

udp1::udp1(qwidget

  //

建立udpsocket,并連接配接槽函數,用來接收資料

_udp

qudpsocket;

_udp->bind(10001);

connect(_udp,

使用定時器來定時發送時間戳

qtimer*

timer

qtimer;

timer->setinterval(1000);

timer->start();

connect(timer,

&qtimer::timeout,

[&](){

quint64

timestamp

qdatetime::currentmsecssinceepoch();

str

qstring::number(timestamp);

普通udpsocket發送

_udp->writedatagram(str.toutf8(),

qhostaddress("127.0.0.1"),

10002);

#else

廣播發送,注意:qhostaddress::broadcast是255.255.255.255,

192.168.6.255

//  

qhostaddress::broadcast,

multicast,

224.0.0.1~224.0.0.255

is

multicast

address

of

lan

     _udp->writedatagram(str.toutf8(),

qhostaddress("224.0.0.131"),

});

udp1::slotreadyread()

while(_udp->haspendingdatagrams())

datagramsize

_udp->pendingdatagramsize();

buf(datagramsize,

0);

_udp->readdatagram(buf.data(),

buf.size());

qdebug()

<<"udp1"<<

buf;

udp2_h

udp2

udp2(qwidget

"udp2.h"

udp2::udp2(qwidget

bind

and

must

be

same

tpye(ipv4

or

ipv6)

_udp->bind(qhostaddress::anyipv4,

join

(224.0.0.131)

for

recv

mulicast

package

_udp->joinmulticastgroup(qhostaddress("224.0.0.131"));

qtimer(this);

10001);

udp2::slotreadyread()

<<

"udp2"

<<buf;

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket

控制台輸出結果如下:

5.關于QT中的網絡程式設計,QTcpSocket,QUdpSocket

繼續閱讀