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

C
编写IP选择下拉选,头文件ChooseInterface.h

#ifndef
CHOOSEINTERFACE_H

#define
CHOOSEINTERFACE_H

#include
<QDialog>

#include
<QComboBox>

class
ChooseInterface
:
public
QDialog

{

Q_OBJECT

public:

explicit
ChooseInterface(QWidget
*parent
);

QComboBox*
_comboBox;

QString
_strSelect;

signals:

public
slots:

void
slotComboBoxChange(QString);

};

#endif
//
CHOOSEINTERFACE_H

编写ChooseInterface.cpp

#include
"ChooseInterface.h"

#include
<QNetworkInterface>

#include
<QVBoxLayout>

ChooseInterface::ChooseInterface(QWidget
*parent)
:

QDialog(parent)

{

/*
get
all
interface
*/

QList<QHostAddress>
addrList
=
QNetworkInterface::allAddresses();

#if
0

QList<QNetworkInterface>
infList =
QNetworkInterface::allInterfaces();

QList<QNetworkAddressEntry>
entryList =
infList).addressEntries();

entryList).broadcast()

#endif

//编写一个下拉选

_comboBox
=
new
QComboBox;

QVBoxLayout*
lay
=
new
QVBoxLayout(this);

lay->addWidget(_comboBox);

foreach(QHostAddress
addr,
addrList)

{

//将地址都转换成为ipv4的地址

quint32
ipaddr
=
addr.toIPv4Address();

//的ip

if(ipaddr
==
0)

continue;

//在comboBox中添加下拉选

_comboBox->addItem(QHostAddress(ipaddr).toString());

}

//当下拉选发生变化时的操作

connect(_comboBox,
SIGNAL(currentIndexChanged(QString)),

this,
SLOT(slotComboBoxChange(QString)));

}

void
ChooseInterface::slotComboBoxChange(QString
str)

{

this->_strSelect
=
str;

}

上面的运行结果是:

编写TcpServer.h

#ifndef
TCPSERVER_H

#define
TCPSERVER_H

#include
<QWidget>

#include
<QTcpServer>

#include
<QTcpSocket>

#include
<QTextBrowser>

class
TcpServer:public
QWidget

{

Q_OBJECT

public:

explicit
TcpServer(QWidget
*parent
);

QTcpServer*
_server;

QTcpSocket*
_socket;

QTextBrowser*
_show;

signals:

public
slots:

void
slotNetConnection();

void
slotReadyRead();

};

#endif
//
TCPSERVER_H

编写TcpServer.cpp

#include
"TcpServer.h"

#include
<QHBoxLayout>

#include
<QNetworkInterface>

#include
<QMessageBox>

#include
"ChooseInterface.h"

TcpServer::TcpServer(QWidget
*parent)
:

QWidget(parent)

{

//
创建服务器并监听

_server
=
new
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()),

this,
SLOT(slotNetConnection()));

_show
=
new
QTextBrowser;

QHBoxLayout*
lay
=
new
QHBoxLayout(this);

lay->addWidget(_show);

}

void
TcpServer::slotNetConnection()

{

//
判断是否有未处理的连接

while(_server->hasPendingConnections())

{

//
调用nextPeddingConnection去获得连接的socket

_socket
=
_server->nextPendingConnection();

_show->append("New
connection
....");

//
为新的socket提供槽函数,来接收数据

connect(_socket,
SIGNAL(readyRead()),

this,
SLOT(slotReadyRead()));

}

}

void
TcpServer::slotReadyRead()

{

//
接收数据,判断是否有数据,如果有,通过readAll函数获取所有数据

while(_socket->bytesAvailable()
>
0)

{

_show->append("Data
arrived
.....
");

QByteArray
buf
=
_socket->readAll();

_show->append(buf);

}

}

编写TcpClient.h

#ifndef
TCPCLIENT_H

#define
TCPCLIENT_H

#include
<QWidget>

#include
<QTcpSocket>

#include
<QLineEdit>

class
TcpClient:public
QWidget

{

Q_OBJECT

public:

explicit
TcpClient(QWidget
*parent
);

QTcpSocket*
_socket;

QLineEdit*
_lineEdit;

signals:

public
slots:

void
slotButtonClick();

};

#endif
//
TCPCLIENT_H

编写TcpClient.cpp

#include
"TcpClient.h"

#include
<QHBoxLayout>

#include
<QPushButton>

TcpClient::TcpClient(QWidget
*parent):

QWidget(parent)

{

_socket
=
new
QTcpSocket(this);

_socket->connectToHost("127.0.0.1",
9988);

_lineEdit
=
new
QLineEdit;

QHBoxLayout*
lay
=
new
QHBoxLayout(this);

lay->addWidget(_lineEdit);

QPushButton*
button
=
new
QPushButton("Send");

lay->addWidget(button);

connect(button,
SIGNAL(clicked()),
this,
SLOT(slotButtonClick()));

connect(_lineEdit,
SIGNAL(returnPressed()),
this,
SLOT(slotButtonClick()));

}

void
TcpClient::slotButtonClick()

{

QString
strText
=
_lineEdit->text();

if(strText.isEmpty())

return;

_socket->write(strText.toUtf8());

_lineEdit->clear();

}

MyWidget.h

#ifndef
MYWIDGET_H

#define
MYWIDGET_H

#include
<QWidget>

class
MyWidget
:
public
QWidget

{

Q_OBJECT

public:

explicit
MyWidget(QWidget
*parent
);

signals:

public
slots:

};

#endif
//
MYWIDGET_H

MyWidget.cpp

#include
"MyWidget.h"

#include
<QApplication>

#include
"TcpServer.h"

#include
"TcpClient.h"

MyWidget::MyWidget(QWidget
*parent)
:

QWidget(parent)

{

}

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();

}

运行结果:


编写UDP程序

UDPServer.pro

QT
+=
gui widgets
network

CONFIG
+=
C++11

HEADERS
+=
\

Udp1.h
\

Udp2.h
\

MyWidget.h

SOURCES
+=
\

Udp1.cpp
\

Udp2.cpp
\

MyWidget.cpp

Udp1.h

#ifndef
UDP1_H

#define
UDP1_H

#include
<QWidget>

#include
<QUdpSocket>

class
Udp1
:
public
QWidget

{

Q_OBJECT

public:

explicit
Udp1(QWidget
*parent
);

QUdpSocket*
_udp;

signals:

public
slots:

void
slotReadyRead();

};

#endif
//
UDP1_H

Udp1.cpp

#include
"udp1.h"

#include
<QTimer>

#include
<QDateTime>

Udp1::Udp1(QWidget
*parent)
:

QWidget(parent)

{

//
创建udpsocket,并连接槽函数,用来接收数据

_udp
=
new
QUdpSocket;

_udp->bind(10001);

connect(_udp,
SIGNAL(readyRead()),

this,
SLOT(slotReadyRead()));

//
使用定时器来定时发送时间戳

QTimer*
timer
=
new
QTimer;

timer->setInterval(1000);

timer->start();

connect(timer,
&QTimer::timeout,
[&](){

quint64
timestamp
=
QDateTime::currentMSecsSinceEpoch();

QString
str
=
QString::number(timestamp);

#if
0

//
普通UDPsocket发送

_udp->writeDatagram(str.toUtf8(),
QHostAddress("127.0.0.1"),
);

#else

//
广播发送,注意:QHostAddress::Broadcast是255.255.255.255,
192.168.6.255

//  
_udp->writeDatagram(str.toUtf8(),
QHostAddress::Broadcast,
10002);

//
multicast,
224.0.0.1~224.0.0.255
is
multicast
address
of
LAN

_udp->writeDatagram(str.toUtf8(),
QHostAddress("224.0.0.131"),
10002);

#endif

});

}

void
Udp1::slotReadyRead()

{

while(_udp->hasPendingDatagrams())

{

quint32
datagramSize
=
_udp->pendingDatagramSize();

QByteArray
buf(datagramSize,
0);

_udp->readDatagram(buf.data(),
buf.size());

qDebug()
<<"Udp1"<<
buf;

}

}

Udp2.h

#ifndef
UDP2_H

#define
UDP2_H

#include
<QWidget>

#include
<QUdpSocket>

class
Udp2
:
public
QWidget

{

Q_OBJECT

public:

explicit
Udp2(QWidget
*parent
);

QUdpSocket*
_udp;

signals:

public
slots:

void
slotReadyRead();

};

#endif
//
UDP2_H

Udp2.cpp

#include
"udp2.h"

#include
<QTimer>

#include
<QDateTime>

#include
<QLineEdit>

Udp2::Udp2(QWidget
*parent)
:

QWidget(parent)

{

_udp
=
new
QUdpSocket;

//
the
address
of
bind
and
multicast
must
be
same
tpye(IPV4
or
IPV6)

_udp->bind(QHostAddress::AnyIPv4,
10002);

//
join
the
multicast
address
(224.0.0.131)
for
recv
mulicast
package

_udp->joinMulticastGroup(QHostAddress("224.0.0.131"));

connect(_udp,
SIGNAL(readyRead()),

this,
SLOT(slotReadyRead()));

QTimer*
timer
=
new
QTimer(this);

timer->setInterval(1000);

timer->start();

connect(timer,
&QTimer::timeout,
[&](){

quint64
timestamp
=
QDateTime::currentMSecsSinceEpoch();

QString
str
=
QString::number(timestamp);

_udp->writeDatagram(str.toUtf8(),
QHostAddress("127.0.0.1"),
10001);

});

}

void
Udp2::slotReadyRead()

{

while(_udp->hasPendingDatagrams())

{

quint32
datagramSize
=
_udp->pendingDatagramSize();

QByteArray
buf(datagramSize,
0);

_udp->readDatagram(buf.data(),
buf.size());

qDebug()
<<
"Udp2"
<<buf;

}

}

运行结果:

控制台输出结果如下:

5.关于QT中的网络编程,QTcpSocket,QUdpSocket的更多相关文章

  1. Qt 多线程和网络编程学习

    一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...

  2. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  3. Qt学习之网络编程(一)

    一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...

  4. QT中的SOCKET编程

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  5. 网游中的网络编程系列1:UDP vs. TCP

    原文:UDP vs. TCP,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网 ...

  6. 网游中的网络编程3:在UDP上建立虚拟连接

    目录 网游中的网络编程系列1:UDP vs. TCP 网游中的网络编程2:发送和接收数据包 网游中的网络编程3:在UDP上建立虚拟连接 TODO 二.在UDP上建立虚拟连接 介绍 UDP是无连接的,一 ...

  7. 第84节:Java中的网络编程(中)

    第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...

  8. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  9. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...

随机推荐

  1. 计蒜客NOIP模拟赛4 D1T1 小X的质数

    小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1以外,没有其他因数的数字. 但由于小 X ...

  2. PKUWC 2018 滚粗记

    day0 上午居然考了一场考试,大爆炸,攒了一波RP,下午也没有心思去落实题目,而是一心去搞颓废,到了晚上看时间还早,于是就看了一波上午考试的Solution,懵逼.jpg day1 上午考数学,前一 ...

  3. getopt_long函数使用【转】

    转自:https://blog.csdn.net/cashey1991/article/details/7942809 平时在写程序时常常需要对命令行参数进行处理,当命令行参数个数较多时,如果按照顺序 ...

  4. Mianbot:基于向量匹配的情境式聊天机器人

    Mianbot是采用样板与检索式模型搭建的聊天机器人,目前有两种产生回覆的方式,专案仍在开发中:) 其一(左图)是以词向量进行短语分类,针对分类的目标模组实现特征抽取与记忆回覆功能,以进行多轮对话,匹 ...

  5. H3C系列之三层交换机系统版本升级

    本文涉及到的硬件与软件交换机:H3C S3600-28TP-SItftp软件:tftpd32小软件升级的文件:S36SI_E-CMW310-R1702P44.zip 关于升级的文件说明如下: S36S ...

  6. Linux学习之CentOS(十二)------磁盘管理之 磁盘的分区、格式化、挂载(转)

    磁盘分区.格式化.挂载磁盘分区    新增分区    查询分区    删除分区磁盘格式化    mkfs    mke2fs磁盘挂载与卸载    mount    umount 磁盘的分区.格式化.挂 ...

  7. javascript面向对象(给对象添加属性和方法的方式)

    1.在定义对象时,直接把属性和方法添加 <script type="text/JavaScript"> //给对象直接在定义时添加属性和方法         var g ...

  8. Map value类型不同的写法

    Map value类型不同的写法 Map<String, Object> accountMap=new HashMap<String, Object>(); int userI ...

  9. Unrecognized token 'XXXX': was expecting ('true', 'false' or 'null')

    原因是,返回或发送数据格式不规范. 当dataType指定为json后,1.4+以上的jquery版本对json格式要求更加严格.如果不是严格的json格式,就不能正常执行success回调函数. J ...

  10. Linux——makefile编写

    以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...