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. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  2. bzoj3685普通van Emde Boas树 线段树

    3685: 普通van Emde Boas树 Time Limit: 9 Sec  Memory Limit: 128 MBSubmit: 1932  Solved: 626[Submit][Stat ...

  3. 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人

    概述 这个工作尝试重现这个论文的结果 A Neural Conversational Model (aka the Google chatbot). 它使用了循环神经网络(seq2seq 模型)来进行 ...

  4. target-densitydpi=device-dpi会使其他ui插件布局变小

    target-densitydpi=device-dpi会使其他ui插件布局变小 东哥说:不用rem了,把meta改成这样<meta name="viewport" cont ...

  5. SQL之LIMIT ,OFFSET

    SELECT prod_name FROM Products LIMIT OFFSET ; LIMIT 4 OFFSET 3指示MySQL等DBMS返回从第3行(从0行计数)起的4行数据.第一个数字是 ...

  6. JavaScript反调试技巧

    一.函数重定义 这是一种最基本也是最常用的代码反调试技术了.在JavaScript中,我们可以对用于收集信息的函数进行重定义.比如说,console.log()函数可以用来收集函数和变量等信息,并将其 ...

  7. angular.run和angular.config的区别

    ng的运行机制: config阶段是给了ng上下文一个针对constant与provider修改其内部属性的一个阶段 而run阶段是在config之后的在运行独立的代码块,通常写法runBlock 简 ...

  8. Lucene初体验——Hello Word实现

    1.创建索引 /** * 建立索引 */ public void index(){ IndexWriter writer=null; try { //1.创建Directory //Directory ...

  9. 通过AIDL在两个APP之间Service通信

    一.项目介绍 [知识准备] ①Android Interface definition language(aidl,android接口定义语言),其目的实现跨进程的调用.进程是程序在os中执行的载体, ...

  10. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

    ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...