设为首页 加入收藏

TOP

49.Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)(一)
2019-08-14 00:08:38 】 浏览:146
Tags:49.Qt- 网络编程 QTCPSocket QTCPServer 实现 简易 网络 调试 助手

8.9更新说明

如下图所示,支持十六进制收发,下载地址已经更新.源码下载地址:https://download.csdn.net/download/qq_37997682/11504836

 


 

在上章 48.QT-网络通信讲解1,我们学习了网络通信基础后,本章便来实战一篇.

PS:支持客户端和服务器,提供源码,并且服务器支持多客户端连入,并且可以指定与个别客户端发送数据,也可以给所有连入的客户端发送数据.

1.效果图所下所示:

 

如下图所示,当服务器状态下,如果有客户端连入,会提示客户端信息:

 

2.效果操作

客户端操作:

 

服务器操作:

从上面操作可以看出,服务器支持多客户端连入,并且可以指定与个别客户端发送数据,也可以给所有连入的客户端发送数据.

3.首先创建UI

 

4.注意事项

不管是服务器还是客户端,都可以通过peerAddress()和peerPort()来获取目标地址和目标端口

4.1服务器监听时

比如服务器,则可以通过QTcpSocket的peerAddress()则可以获取连入的客户端地址

也可以通过children()来获取所有连入的客户端(需要注意的是也会获取到服务器本身的tcp地址和端口),示例如下:

QList<QTcpSocket *> m_tcps = m_server.findChildren<QTcpSocket *>();
foreach (QTcpSocket *tcp, m_tcps)
{
        qDebug() << "Address:" << tcp->peerAddress ();
        qDebug() << "Port:" << tcp->peerPort  ();
}

如果我们只向连入的客户端某个端口发送数据时,就可以通过上面的方式筛选出来.

这样做的话如果觉得很麻烦,也可以将之前连接上的客户端存到QList里再进行筛选.

4.2 QTcpSocket步骤

  • 首先通过connectToHost()来连接服务器.
  • 然后调用waitForConnected()来判断是否连接服务器超时
  • 当我们接收到服务器数据的时候,则会发出readyRead()信号,然后再进行read ()读取发来的数据
  • 发送数据时,则调用write()函数进行发送,当bytesWritten()信号函数触发时,便可以获取成功发送的数据长度.

注意:如果read到的数据长度量不是自己想要的,此时我们便可以通过bytesAvailable()来读取接收到的数据长度量.当达到多少时,再进行read ()读取.

 

4.3 QTcpServer步骤

  • 首先通过listen(QHostAddress::AnyIPv4, port)来监听所有来自IPV4的客户端
  • 当有新的客户端连接服务器的时候,会自动触发newConnection()信号函数,然后我们可以通过通过QTcpSocket * nextPendingConnection()成员函数来获取当前连接上的新的客户端类.然后再对QTcpSocket来进行信号槽绑定
  • 当客户端发来数据的时候,则可以通过我们定义的onServerDataReady()来读取数据
  • 当我们向某个连接的客户端发送数据时,则通过m_server.findChildren()来筛选出来,然后write即可.

 

5.代码介绍

5.1  头文件介绍

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QTcpServer>
#include <QMessageBox>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

    QTcpSocket m_client;
    QTcpServer m_server;
    QString targetAddr;
    int targetPort;
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void on_btn_switch_clicked();
    void on_tcpMode_currentIndexChanged(int index);
    void on_btn_send_clicked();             //发送按钮
    void on_betn_clear_clicked();           //清空按钮

    //客户端槽函数
    void onClientConnected();
    void onClientDisconnected();
    void onClientDataReady();
    void onClientBytesWritten(qint64 bytes);
    void onClientErr(QAbstractSocket::SocketError socketError);

    //服务器槽函数
    void onServerNewConnection();
    void onServerConnected();
    void onServerDisconnected();
    void onServerDataReady();
    void onServerBytesWritten(qint64 bytes);
private:
    void startConnect(bool ison);

    void initClientSignals();   //初始化客户端信号槽
    bool startClient();         //启动客户端

    void initServerSignals();   //初始化客户端信号槽
    bool startServer();     //启动服务器

    Ui::Widget *ui;
};

#endif // WIDGET_H

5.2  widget.cpp介绍

该cpp主要是用来处理界面操作的函数

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    startConnect(false);
    on_tcpMode_currentIndexChanged(0);
    initClientSignals();        //初始化客户端信号槽
    initServerSignals();        //初始化服务器信号槽

    //限制只能数字输入
    QRegExp regx("[0-9]+$");
    QValidator *validator = new QRe
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Qt开源编辑器qsciscintilla的一些.. 下一篇正睿暑期培训day4考试

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目