Qt Tcp Socket 通信实现字符串传输

1,652 阅读2分钟

一、QTcpServer 与 QTcpSocket 基本操作

1.1 QTcpServer 的基本操作:

  1. 调用 listen 监听端口。
  2. 连接信号 newConnection,在槽函数里调用 nextPendingConnection 获取连接进来的 socket

1.2 QTcpSocket 的基本操作:

  1. 调用 connectToHost 连接服务器。
  2. 调用 waitForConnected 判断是否连接成功。
  3. 连接信号 readyRead 槽函数,异步读取数据。
  4. 调用 waitForReadyRead,阻塞读取数据。

二、服务器端

2.1 新建一个服务器端工程,填入

QT += network
#include<QtNetwork/QtNetwork>

2. mainwindows.h文件中加入成员

public:
    void init();
    
private slots:
    /// @brief 发送消息
    void sendMessage();
    
    /// @brief 接收数据
    void onReciveData();  
    
    /// @brief 建立 tcp 监听事件
    void newListen(); 
    
    /// @brief 接收客户端连接
    void acceptConnection(); 
    
    /// @brief 错误输出
    void showError(QAbstractSocket::SocketError); 
private:
    QTcpSocket *tcpSocket;
    QTcpServer *tcpServer;

3. 函数的定义

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();

    setWindowTitle(QString::fromLocal8Bit("Server"));
    connect(ui->sendBtn,SIGNAL(clicked(bool)),SLOT(sendMessage()));
}

构造函数中,调用 init() 函数,当点击了发送按钮就会产生一个槽函数 sendMessage,然后直接调用这个槽函数。

void MainWindow::init()
{
    tcpServer = new QTcpServer;
    tcpSocket = new QTcpSocket;
    newListen();
    connect(tcpServer, SIGNAL(newConnection()), SLOT(acceptConnection()));
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(showError(QAbstractSocket::SocketError)));
}

新建一个 QTcpServer 类的对象,和 QTcpSocket 类的对象。调用 newlisten() 监听服务器的 socket 请求函数,有新的连接的时候,调用 acceptConnection() 函数,失败的话调用 showError()

void MainWindow::newListen()
{
    if(!tcpServer->listen(QHostAddress::Any,6666))
    {
        qDebug()<<tcpServer->errorString();

        tcpServer->close();
    }
}

QHostAddress::Any4any-address 栈,与该地址绑定的 socket 将侦听 IPv46666 端口。

void MainWindow::acceptConnection()
{
    tcpSocket = tcpServer->nextPendingConnection();
    connect(tcpSocket,SIGNAL(readyRead()),SLOT(onReciveData()));
}

连接成功后,连接信号 readyRead(),调用 onReciveData()

// ---------------------------
void MainWindow::sendMessage()  //发送数据
{
    QString textEdit = ui->lineEdit->text();
    QString strData =QString::fromLocal8Bit("Time: ") + QTime::currentTime().toString() + "\n" + textEdit.toLocal8Bit() + "\n";
    QByteArray sendMessage = strData.toLocal8Bit();
    mChat += ("Send " + sendMessage);
    ui->textEdit->setText(mChat);
    tcpSocket->write(sendMessage);
}

// ----------------------------
void MainWindow::onReciveData()  //读取数据
{
    QString data = tcpSocket->readAll();
    qDebug()<<data;
    mChat +=("Recv " + data);
    ui->textEdit->setText(mChat);
}

发送数据,获取编辑框中的字符串,发送。