1349|1

303

帖子

0

资源

一粒金砂(高级)

4412开发板Qt网络编程-TCP实现服务器和客户端 [复制链接]

网络编程有 TCP 和 UDP,TCP 编程需要用到俩个类:QTcpServer 和 QTcpSocket。

. 1.jpg

1 TCP 实现服务器和客户端
TCP 协议(Transmission Control Protocol)是一种面向连接的,可靠的,基于字节流的传输层通信协议,传输数据稳定可靠。
在 help 索引中搜索到如图 两个重要类:

2.jpg 服务器编程中两个类都会用到,客户端编程中只会用到 QTcpSocket 对象。
本实验中对 QTcpServer 类的基本使用:
(1)监听客户端连接。
(2)每当有新的客户端连接服务器的时候,会自动触发信号,
(3)根据当前连接上的新的客户端创建一个 Socket 对象,将数据的收发动作交给 socket 套 接字去处理。
(4)关闭服务器 close();
对 QTcpSocket 类的基本使用:
(1)服务器端:有新连接时获取连接状态,绑定 socket 。
(2)客户端:通过 socket 连接服务器,连接成功触发信号。

(3)当有数据到来时会触发信号,用 readAll()读取。
(4)通过读写 socket 收发数据。
具体步骤:
步骤一:创建工程,在工程文件.pro 中添加 network,如图:

3.jpg

步骤二:设计 ui 界面,
1. 在属性编辑栏设置主窗口大小:

4.jpg

2. 添加组件
接收窗口: Plain Text Edit
发送窗口,IP 地址窗口,端口号窗口:Line Edit
打开服务器,关闭服务器:Push Button
拖拽完成后逐个布局,根据需要设置组件大小,这里端口号框设置成了最小 200

5.jpg

按钮布局:拖拽按钮和弹簧,然后点击水平布局。

6.jpg

然后选中全部组件,点击栅格布局:

7.jpg

最后更改组件名称注释,完成后如图 :

8.jpg

步骤三:服务器端编程:
1.创建 QTcpServer 对象
2.创建监听端口,使得客户端可以使用这个端口访问服务器,使用 listen 函数。
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
第一个参数是绑定指定的地址(即本机服务器 IP),第二个参数是绑定的本服务器端口号。
监听某个端口时,如果有新连接进来就发出 newConnection()信号。
3.当服务器对象被访问时,会发出 newConnection()信号,所以为该信号添加槽函数并用一个 QTcpSocket
对象接受客户端的访问。
4.当socket接受缓冲区有新数据到来时,会发出readyRead()信号,为该信号添加槽函数,使用readyRead()
读取。
5.socket 发送数据可直接调用 write()成员函数。
6.关闭端口号。
代码如下:

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class TcpServer;
}
class TcpServer : public QMainWindow
{
Q_OBJECT
public:

explicit TcpServer(QWidget *parent = 0); ~TcpServer();
QTcpServer * tcpServer;
QTcpSocket * tcpSocket;
public slots:
void newConnection_Slot(void);
void readyRead_Solt(void);
private slots:
void on_openBu_clicked();
void on_sendBu_clicked();
void on_closeBu_clicked();
private:
Ui::TcpServer *ui;
};
#include "tcpserver.h" #include "ui_tcpserver.h" #include <QTcpServer>
#include <QTcpSocket>
#include <QString>
TcpServer::TcpServer(QWidget *parent) :
QMainWindow(parent), ui(new Ui::TcpServer)
{
ui->setupUi(this);
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
//连接信号与槽函数进行绑定
connect(tcpServer,SIGNAL(newConnection()),SLOT(newConnection_Slot()));
}
//连接信号槽函数

void TcpServer::newConnection_Slot(void)
{
//连接客户端后 socket
tcpSocket = tcpServer->nextPendingConnection();
//套接字的接收数据信号与都数据槽函数连接
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Solt()));
}
//读取数据
void TcpServer::readyRead_Solt(void)
{
QString buf;
//读取
buf = tcpSocket->readAll();
ui->recvEdit->appendPlainText(buf);
}
TcpServer::~TcpServer()
{
delete ui;
}
//打开
void TcpServer::on_openBu_clicked()
{
//监听
tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());
}
//发送数据
void TcpServer::on_sendBu_clicked()
{
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}
//关闭
void TcpServer::on_closeBu_clicked()

{
tcpSocket->close();
}
步骤四:客户端编程

9.jpg

1.创建 QTcpSocket 套接字对象
2.使用套接字对象的成员函数去请求连接服务器。
void connectToHost(const QHostAddress &address, quint16 port, openMode mode = ReadWrite);
第一个参数为服务器 IP 地址,第二个参数为服务器端口号。第三个参数为打开方式,默认为可读可写
函数功能:请求连接服务器连接成功后发出connected()信号,绑定槽函数connected_Solt()去操作socket。
3.使用 write 函数向服务器发送数据,当 socket 接收缓冲区有新数据到来时
会发出 readyRead()信号,为该信号添加槽函数以读取数据。
4.断开与服务器的连接。

class TcpClient : public QMainWindow
{
....... private slots:
void on_openBt_clicked();
void connected_Solt(void);
void readyRead_Solt(void);
void on_sendEdit_2_clicked();
void on_closeBt_clicked();
};

TcpClient::TcpClient(QWidget *parent) :
QMainWindow(parent), ui(new Ui::TcpClient)
{
ui->setupUi(this);
//创建 socket 对象
tcpSocket = new QTcpSocket(this);
}
TcpClient::~TcpClient()
{
delete ui;
}
//打开(连接服务器)
void TcpClient::on_openBt_clicked()
{
tcpSocket->connectToHost(ui->ipEdit->text(),ui->portEdit->text().toUInt());
connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Solt()));
}
//等待数据到来
void TcpClient::connected_Solt(void)
{
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Solt()));
}
//读取数据
void TcpClient::readyRead_Solt(void)
{
ui->recvEdit->appendPlainText(tcpSocket->readAll());
}
//发送
void TcpClient::on_sendEdit_2_clicked()
{
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}
//关闭
void TcpClient::on_closeBt_clicked()

{
tcpSocket->close();
}
编译运行成功,使用服务器和客户端通信如图:

  10.jpg

11.jpg

此帖出自ARM技术论坛

回复

4601

帖子

1

资源

五彩晶圆(初级)

PC上学就好,这种东西不用板子。

个人签名

默认摸鱼


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表