QT TCP网络编程

本文详细介绍了使用QT进行TCP网络编程的客户端和服务器端实现。在客户端,通过QTcpSocket类完成连接、断开、读取和发送数据。在服务器端,利用QTcpServer处理多客户端连接,特别讨论了如何解决在处理新连接和接收数据时无法直接获取SocketDescriptor的问题,并提供了两种解决方案,最终选择了通过QTcpServer的nextPendingConnection()函数来识别客户端。
摘要由CSDN通过智能技术生成
首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP,就是开放式、无连接、不可靠的传输层通信协议。
下面,我一次进行客户端和服务器端的QT实现。我的开发环境是:QT Creator 5.7。

先看下效果图:
one server---two clients

一:客户端编程

QT提供了QTcpSocket类,可以直接实例化一个客户端,可在help中索引如下:

The QTcpSocket class provides a TCP socket. More...
Header      #include <QTcpSocket> 
qmake       QT += network
Inherits:   QAbstractSocket
Inherited By:   QSslSocket
从这里,我们可以看到,必须要在.pro文件中添加QT += network才可以进行网络编程,否则是访问不到<QTcpSocket>头文件的。

客户端读写相对简单,我们看一下代码头文件:
#ifndef MYTCPCLIENT_H
#define MYTCPCLIENT_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMessageBox>
namespace Ui {
class MyTcpClient;
}

class MyTcpClient : public QMainWindow
{
    Q_OBJECT

public:
    explicit MyTcpClient(QWidget *parent = 0);
    ~MyTcpClient();

private:
    Ui::MyTcpClient *ui;
    QTcpSocket *tcpClient;

private slots:
    //客户端槽函数
    void ReadData();
    void ReadError(QAbstractSocket::SocketError);

    void on_btnConnect_clicked();
    void on_btnSend_clicked();
    void on_pushButton_clicked();
};

#endif // MYTCPCLIENT_H
我们在窗口类中,定义了一个私有成员QTcpSoket *tcpClient。

1) 初始化QTcpSocket
在构造函数中,我们需要先对其进行实例化,并连接信号与槽函数:

    //初始化TCP客户端
    tcpClient = new QTcpSocket(this);   //实例化tcpClient
    tcpClient->abort();                 //取消原有连接
    connect(tcpClient, SIGNAL(readyRead()), this, SLOT(ReadData()));
    connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), \
            this, SLOT(ReadError(QAbstractSocket::SocketError)));

2)建立连接 和 断开连接

    tcpClient->connectToHost(ui->edtIP->text(), ui->edtPort->text().toInt());
    if (tcpClient->waitForConnected(1000))  // 连接成功则进入if{}
    {
        ui->btnConnect->setText("断开");
        ui->btnSend->setEnabled(true);
    }
a)建立TCP连接的函数:void connectToHost(const QHostAddress &address, quint16 port, OpenMode openMode = ReadWrite)是从QAbstractSocket继承下来的public function,同时它又是一个virtual function。作用为:Attempts to make a connection to address on port port。
b)等待TCP连接成功的函数:bool waitForConnected(int msecs = 30000
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值