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;
控制台输出结果如下: