1
建立一個項目:tcpserver.pro
a
修改tcpserver.pro,注意:如果是想使用網絡庫,需要加上network
sources
+=
\
tcpserver.cpp
tcpclient.cpp
headers
tcpserver.h
tcpclient.h
qt
gui widgets
network
config
c++11
b
建立如下檔案,因為要用到網絡庫,是以加上network
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;
上面的運作結果是:
編寫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();
運作結果:
2
編寫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;
控制台輸出結果如下: