Qt实现TCP网络编程

本文实例为大家分享了Qt实现TCP网络编程的具体代码,供大家参考,具体内容如下

1.Qt中的TCP客户端编程

Qt中的TCP客户端编程:

对于Qt编程而言,网络只是数据传输的通道
Qt提供了QTcpSocket类(封装了TCP协议细节)
将QTcpSocket的对象当做黑盒使用,进行数据收发

QTcpSocket的使用方式:

1.连接服务端主机(connectToHost())
2.发送数据/接受数据(write()/read())
3.关闭连接(close())

QTcpSocket的注意事项:

默认情况下,QTcpSocket使用异步编程的方式:
操作完成后立即返回
通过发送信号的方式返回操作结果
QTcpSocket提供了辅助函数,可完成同步编程的方式
waitForConnected()/waitForDisconnected()
waitForBytesWritten()/waitForReadyread()

QTcpSocket的同步编程:

编程实验:同步编程

#include <QCoreApplication>
#include <QTcpSocket>
#include <QDebug>
#include <QThread>

void SyncClientDemo()
{
    QTcpSocket client;
    char buf[256] = {0};
    client.connectToHost("127.0.0.1",8080);

    qDebug() << "Connected:" << client.waitForConnected();
    qDebug() << "Send Bytes:" << client.write("CKY");
    qDebug() << "Send Status:" << client.waitForBytesWritten();
    qDebug() << "Data Avilable:" << client.waitForReadyRead();
    qDebug() << "Received Bytes:" << client.read(buf, sizeof(buf));
    qDebug() << "Received Data:" << buf;

    QThread::sleep(5000);

    client.close();

    client.waitForDisconnected();

}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    SyncClientDemo();

    return a.exec();
}

QTcpSocket的异步编程:

QTcpSocket对象通过发送信号的方式返回操作结果
可以在程序中将对应的信号连接到槽函数,获取结果
GUI应用程序中通常使用QTcpSocket的异步方式

QTcpSocket中的关键信号:

connected():成功连接远端主机
disconnected():远端主机断开连接
readyRead():远程数据到达本机
bytesWritten(qint64):数据成功发送至系统(OS)

编程实验:QTcpSocket异步编程

#include "clientdemo.h"
#include <QDebug>
#include <QHostAddress>

ClientDemo::ClientDemo(QObject* parent) : QObject(parent)
{
    connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}

void ClientDemo::onConnected()
{
    qDebug() << "onConnected()";
    qDebug() << "Local Address:" << m_client.localAddress();
    qDebug() << "Loacl Port:" << m_client.localPort();
}
void ClientDemo::onDisconnected()
{
    qDebug() << "onDiecennected()";
}
void ClientDemo::onDataReady()
{
    char buf[256] = {0};

    qDebug() << "onDataReady:" << m_client.read(buf, sizeof(buf));
    qDebug() << "Data:" << buf;
}
void ClientDemo::onBytesWritten(qint64 bytes)
{
    qDebug() << "onBytesWritten" << bytes;
}
void ClientDemo::connectTo(QString ip, int port)
{
    m_client.connectToHost(ip, port);
}
qint64 ClientDemo::send(const char* data, int len)
{
    return m_client.write(data, len);
}
qint64 ClientDemo::available()
{
    return m_client.bytesAvailable();
}
void ClientDemo::close()
{
    m_client.close();
}

1.Qt中的TCP服务端编程

网络中的服务端:
服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,为客户端提供功能接口,等
Client/Server软件架构简介

特点;
服务端被动接受连接(服务端无法主动连接客户端)
服务端必须公开网络地址(容易受到攻击)
在职责上:
客户端倾向于处理用于交互及体验(GUI)
服务端倾向于用户数据的组织和存储(数据处理)

B/S网络结构是什么?
Browser/Server软件架构简介
B/S是一种特殊的C/S网络架构
B/S中的客户端统一使用浏览器(Browser)
B/S中的客户端GUI通常采用HTML进行开发
B/S中的客户端与服务端通常采用http协议进行通信

Qt中的TCP服务端编程:

Qt提供了QTcpServer类
将QTcpServer的对象当做黑盒使用,进行连接监听
每一个连接生成一个QTcpSocket对象进行通信

QTcpServer的使用方式:

监听本机地址的端口(listen())
通过信号通知客户端连接(newConnection())
获取QTcpSocket通信对象(nextPendingConnection())
停止监听(close())

QTcpServer的注意事项:

用于处理客户端连接,不进行具体通信
监听的端口只用于响应连接请求
监听到连接后,生成QTcpSocket对象与客户端通信

Client/Server交互流程:

编程实验:QServerSocket编程

#include "serverdemo.h"
#include "QHostAddress"
#include <QDebug>
#include <QTcpServer>
#include <QObjectList>

ServerDemo::ServerDemo(QObject* parent) : QObject(parent)
{
    connect(&m_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

void ServerDemo::onNewConnection()
{
    qDebug() << "onNewConnection";
    QTcpSocket* tcp = m_server.nextPendingConnection();
    connect(tcp, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(tcp, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(tcp, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}

bool ServerDemo::start(int port)
{
    bool ret = true;

    if(!m_server.isListening())
    {
        ret = m_server.listen(QHostAddress("127.0.0.1", port));
    }

    return ret;
}

void ServerDemo::stop()
{
    if(m_server.isListening())
    {
        m_server.close();
    }
}

void ServerDemo::onConnected()
{
    QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());

    if(tcp != NULL)
    {
        qDebug() << "onConnected()";
        qDebug() << "Local Address:" << tcp->localAddress();
        qDebug() << "Loacl Port:" << tcp->localPort();
    }

}
void ServerDemo::onDisconnected()
{
    qDebug() << "onDiecennected()";
}
void ServerDemo::onDataReady()
{
    QTcpServer* tcp = dynamic_cast<QTcpServer*>(sender());
    char buf[256] = {0};

    if(tcp != NULL)
    {
        qDebug() << "onDataReady:" << tcp->read(buf, sizeof(buf));
        qDebug() << "Data:" << buf;
    }
}
void ServerDemo::onBytesWritten(qint64 bytes)
{
    qDebug() << "onBytesWritten" << bytes;
}

ServerDemo::~ServerDemo()
{
    const QObjectList& list = m_server.children();
    for(int i = 0; i < list.length(), i++)
    {
        QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(list[i]);
        if(tcp != NULL)
        {
            tcp->close();
        }
    }
}

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

(0)

相关推荐

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

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

  • 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网络通信学习

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

  • Qt实现TCP网络编程

    本文实例为大家分享了Qt实现TCP网络编程的具体代码,供大家参考,具体内容如下 1.Qt中的TCP客户端编程 Qt中的TCP客户端编程: 对于Qt编程而言,网络只是数据传输的通道Qt提供了QTcpSocket类(封装了TCP协议细节)将QTcpSocket的对象当做黑盒使用,进行数据收发 QTcpSocket的使用方式: 1.连接服务端主机(connectToHost())2.发送数据/接受数据(write()/read())3.关闭连接(close()) QTcpSocket的注意事项: 默认

  • QT实现TCP网络聊天室

    本文实例为大家分享了QT实现TCP网络聊天室的具体代码,供大家参考,具体内容如下 服务器: serverdialog.h #ifndef SERVERDIALOG_H #define SERVERDIALOG_H #include <QDialog> #include <QTcpServer> #include <QTcpSocket> #include <QDebug> #include <QTimer> namespace Ui { clas

  • 用Python进行TCP网络编程的教程

    Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 客户端 大多数连接都是可靠的TCP连接.创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器. 举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接.如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了. 所

  • QT基于TCP网络聊天室

    本文实例为大家分享了QT实现网络聊天室的具体代码,供大家参考,具体内容如下 1.客户端 1.1UI设计 分两个部分,第一部分是消息区里面包含QPlainTextEdit和QListWidget,要显示接收的消息和在线的成员.第二部分QLineEdit发生字符. 1.2 子模块 1.2.1 登录界面 登录界面主要就是要有验证码,防止恶意程序的攻击.通过paintEvent画出一个白色矩形,在白色矩形里面显示四个不同颜色的字母以及随机出现的噪点. 代码: QLoginDialog.h #ifndef

  • Java ByteBuffer网络编程用法实例解析

    做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要直接根据字节流和协议来生成自己的数据对象. 按照之前的编程思维,总是请求然后响应,当然Socket也是请求和响应,不过与单纯的请求响应是不同的. 这里Socket连接往往是要保持住的,也就是长连接,然后设置一个缓冲区,网络流不断的追加到缓冲区.然后后台去解析缓冲区的字节流. 如图所示,网络的流一直在传递,我们收到也许是完成的数据流,也可能是没有传递完的.这里

  • 详解Java网络编程

    一.网络编程 1.1.概述 1.计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程. 2.Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. 3.Java提供的网络类库,可以实现无痛的网络连接,联

  • Qt中网络编程的实现

    目录 一.tcp/IP协议簇与udp 1.TCP/IP协议族 2.udp 3.常用的通讯协议小结 二.Qt中的tcp(这里只展示代码) 1.tcpsever 2.tcpclient 三.QT中的Udp 由于我没有系统的分享一些简单的计算机网络有关的,下面只是简单讲讲tcp/ip协议簇和udp 一.tcp/IP协议簇与udp 1.TCP/IP协议族 TCP/IP实际上是一个协同工作的通信家族,为网络通信提供通路.为方便讨论TCP/IP协议族,大体上分为三部分: ①.Internet协议(IP).

  • QT基于TCP实现网络聊天室程序

    本文实例为大家分享了QT学习:基于TCP的网络聊天室程序,供大家参考,具体内容如下 TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用TCP传输数据,但在正式收发数据前,通信双方必须首先建立连接. 二.TCP编程模型 下面介绍基于TCP的经典编程模型,TCP客户端与服务器间的交互时序如下图所示: 三.TCP服务器端编程实例 TCP服务器端的具体实现

随机推荐