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. ●UVa 11346 Probability

    题链: https://vjudge.net/problem/UVA-11346题解: 连续概率,积分 由于对称性,我们只用考虑第一象限即可. 如果要使得面积大于S,即xy>S, 那么可以选取的 ...

  2. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  3. 有源汇上下界可行流(POJ2396)

    题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...

  4. Linux input子系统 io控制字段【转】

    转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...

  5. python raise和assert的区别

    python中raise和assert的区别 一.使用raise抛出异常 python可以自动触发异常,raise(内置函数)的定义为显示的抛出异常,用户可以使用raise进行判断,显式的引发异常,r ...

  6. YARN整理

    YARN整理 1.YARN的介绍 是一个资源管理.任务调度的框架,主要包含三大模块: ResourceManager(RM):负责所有资源的监控.分配和管理 ApplicationMaster(AM) ...

  7. 游戏流程&游戏规则

  8. Web压力测试和手机App测试

    总纲:认识测试关系和目标http://blog.csdn.net/superxgl/article/details/27189631 一.web测试和App服务端测试 软件安装 建议安装loadrun ...

  9. jQuery 效果 – 隐藏和显示

    在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() 方法. 隐藏.显示.切换,滑动 ...

  10. JavaScript Date(日期)对象

    返回当日的日期和时间 如何使用 Date() 方法获得当日的日期. getFullYear() 使用 getFullYear() 获取年份. getTime() getTime() 返回从 1970 ...