天天看点

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

继续阅读