Qt中TCP协议通信详解

TCP协议是经常使用的通信方式。在QT中做了非常友好的封装,使用非常方便。

需要添加的模块:network

Qt中的TCP类:QTcpSocket , QTcpServer

常用函数介绍

连接目标地址和端口

virtual void QTcpSocket ::connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);

  • 发送数据

inline qint64 QTcpSocket ::write(const QByteArray &data)

  • 监听某个地址和端口号

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

  • 有新的连接信号

void QTcpServer::newConnection();

  • 是否有新的连接

virtual bool QTcpServer::hasPendingConnections() const;

  • 获取新的连接,必须处理完才能继续接收到连接

virtual QTcpSocket *QTcpServer::nextPendingConnection();

  • 收到新的数据信号

void QTcpSocket::readyRead();

  • 读取收到的数据,必须读取完才能继续接收

QByteArray readAll();

使用案例(example)

客户端

#include <QTcpSocket>
#include <QWidget>
#include <QLineEdit>
class Client : public QWidget
{
    Q_OBJECT
public:
    Client(QWidget *parent);

public slots:
    void slotSendButtonClick();
private:
    QTcpSocket *_socket;
    QLineEdit *_lineEdit;
    bool _isConnected;
};
#include "client.h"
#include <QPushButton>
#include <QHBoxLayout>
Client::Client(QWidget *parent)
    : QWidget(parent)
{
    _socket = new QTcpSocket(this);

    _lineEdit = new QLineEdit(this);
    QPushButton *sendButton = new QPushButton("send");
    connect(sendButton, SIGNAL(clicked()), this, SLOT(slotSendButtonClick()));
    connect(_lineEdit, SIGNAL(returnPressed()), this, SLOT(slotSendButtonClick()));
    
    QHBoxLayout *lay = new QHBoxLayout(this);
    lay->addWidget(_lineEdit);
    lay->addWidget(sendButton);

    _isConnected = false;
}

void Client::slotSendButtonClick()
{
    if (!_isConnected)
    {
        _socket->connectToHost("127.0.0.1", 9988);
        _isConnected = true;
    }
    QString text = _lineEdit->text();
    if (!text.isEmpty())
    {
        _socket->write(text.toUtf8());//发送数据
        _lineEdit->clear();
    }
}

服务端

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
class QTextBrowser;
class Server :public QWidget
{
    Q_OBJECT
public:
    Server(QWidget *parent);
public slots:
    void slotCurrentIndexChanged(const QString&);
    void slotNewConnection();
private:
    QTcpServer *_server;
    QTcpSocket *_socket;
    QTextBrowser *_textBrowser;
};
#include "server.h"
#include <QHostAddress>
#include <QTextBrowser>
#include <QByteArray>
#include <QGridLayout>
#include <QNetworkInterface>
#include <QComboBox>
Server::Server(QWidget *parent)
{
    _server = new QTcpServer(this);
    //_server->listen(QHostAddress::Any, 9988);//监听跟本主机相连的所有网口
    connect(_server, SIGNAL(newConnection()),this, SLOT(slotNewConnection()) );

    QList<QHostAddress> addrList = QNetworkInterface::allAddresses();
    QComboBox *comboBox = new QComboBox;
    for (const QHostAddress& addr : addrList)
    {
        quint32 ipAddr = addr.toIPv4Address();
        if (ipAddr != 0)
        {
            comboBox->addItem(QHostAddress(ipAddr).toString());
        }
    }
    connect(comboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotCurrentIndexChanged(const QString&)));

    _textBrowser = new QTextBrowser(this);
    QGridLayout *lay = new QGridLayout(this);
    lay->addWidget(comboBox, 0, 0);
    lay->addWidget(_textBrowser,1,0);
}

void Server::slotCurrentIndexChanged(const QString& item)
{
    if (!_server->isListening())
    {
        _server->listen(QHostAddress(item), 9988);
    }
    
    _textBrowser->append("listen...");
}

void Server::slotNewConnection()
{
    _textBrowser->append("connecting...");
    while (_server->hasPendingConnections())//必须处理完所有的连接,否则有新连接时就不会在发信号过来
    {
        _socket = _server->nextPendingConnection();
        connect(_socket, &QTcpSocket::readyRead, [&]() {
            _textBrowser->append("receive message...");
            QByteArray newMessage = _socket->readAll();
            _textBrowser->append(QString(newMessage));
        });
    }
}

使用效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于QT的TCP通信服务的实现

    目录 一.结构 1.1 套接字 1.2 socket通信流程 1.3 QTcpsocket 1.4 QTcpServer 二.设计UI 2.1 客户端UI 2.2 服务器端UI 三.核心代码 四.效果图 一.结构 1.1 套接字 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字

  • QT编写tcp通信工具(Client篇)

    本文实例为大家分享了QT编写tcp通信工具的具体实现代码,Client篇,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Client端.下一遍再写Server端. 2.基本流程 Client端相对简单:创建QTcpSocket对象,为对象的readyRead,error,connected(可选)分别写槽函数,以处理读数据,错误,连接成功三个事件. 连接使用对象的connectToHost方法,断开使用disconnectFromHost方法. 程序不做编码

  • Qt网络编程实现TCP通信

    Qt网络编程实现TCP通信,供大家参考,具体内容如下 标签(空格分隔): Tcp通信 一.Tcp简介 (1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) . (2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数

  • Qt实现简单的TCP通信

    这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程. 使用QT的网络套接字需要.pro文件中加入一句: QT += network 一.客户端 1.客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创建QTcpSocket套接字对象 socket = new QTcpSocket(); (2)使用这个对象连接服务器 socket->connectToHost(IP, port); (3)

  • QT网络编程Tcp下C/S架构的即时通信实例

    先写一个客户端,实现简单的,能加入聊天,以及加入服务器的界面. #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QDialog> #include <QListWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QGridLayout> #include <QtNetWo

  • QT5实现简单的TCP通信的实现

    目录 一.客户端 二.服务器 三.运行结果 这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程. 使用QT的网络套接字需要.pro文件中加入一句: QT += network 一.客户端 1.客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步: (1)创建QTcpSocket套接字对象 socket = new QTcpSocket(); (2)使用这个对象连接服务器 socket->connec

  • QT网络通信TCP客户端实现详解

    本文实例为大家分享了QT网络通信TCP客户端实现的具体代码,供大家参考,具体内容如下 QT中基于TCP套接字的网络通信需要用到两个类 QTcpServer:服务器类,用于监听客户端连接和客户端建立连接 QTcpSocket:通信套接字类,客户端和服务端都需要使用* 这两个类都属于网络通信的network需要在工程路径下添加network QT += core gui network 服务器 mainwindow.cpp #include "mainwindow.h" #include

  • QT编写tcp通信工具(Server端)

    本文实例为大家分享了QT编写Server端的tcp通信工具的具体代码,供大家参考,具体内容如下 1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Server端.Client端在上一篇. 2.基本流程 新建QTcpServer对象,为其newConnection信号写槽函数.此为新的Client连接信号,在其对应槽函数里使用nextPendingConnection方法获取Client对象,并为Client添加readyRead(读数据),disconnected(断开连接)两个信号写槽

  • Qt TCP网络通信学习

    TCP简介: Transmission Control Protocol,传输控制协议 .用于数据传输的低层网络协议,多个物联网协议都是基于TCP协议的.它是一个面向数据流和连接的可靠传输协议. TCP头部格式: QTcpSocket类为TCP提供了一个接口,继承自QAbstractSocket.可实现POP3.SMTP.NNTP等标准的网络协议,也可以实现自定义的网络协议.异步工作,依靠事件循环来检测到来的数据,并且自动刷新输出的数据.而QAbstractSocket继承自QIODevice,

  • QT实现简单TCP通信

    本文实例为大家分享了QT实现简单TCP通信的具体代码,供大家参考,具体内容如下 开发环境:win7开发软件:Qt5.5.0下图是实现效果 首先点击客户端的connect与服务器连接,连接成功后再服务器会显示“成功连接”,然后在客户端会显示“成功与服务器建立连接”,然后我们就可以分别在服务器和客户端向对方发送数据了. 1 TCP介绍 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 在QT中的网络编程的过程如下

随机推荐