QT socket TCP通信程序模板--客戶端

服務器端的操作是,建立server,然後進入listen監聽狀態,等待客戶端發起連接。

客戶端的編程更爲簡單:

(1)建立tcp socket

(2)把QTcpSocket的3個關鍵的信號槽connect起來,3個信號如下:

(3)把客戶端QTcpSocke對象綁定(bind)與本機端口綁定。當然,也可以不綁定,操作系統會幫我們隨機綁定一個可用端口。

(4)向服務器發起連接請求:
void QAbstractSocket::connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
總共4個形參,前2個比較重要,第一個是服務器的IP,第二個是服務器的端口號。

一旦該函數成功執行,就會觸發QTcpSocket::connected()信號。

(5)發送數據,用QTcpSocket::write(const char *data, qint64 maxSize)

(6)接收數據,在readyRead()的槽裏進行,讀出的函數是:
QByteArray QTcpSocket::readAll()

示例程序:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMap>
#include <QByteArray>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_ptnLink_clicked();
    void when_tcpConnected(void);
    void when_tcpDisConnected(void);
    void when_tcpReceivedData(void);
    void on_ptnSend_clicked();

private:
    Ui::MainWindow *ui;
    QTcpSocket *tcpSkt;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#define debug_print(str) ui->textEditDebug->append(str)


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

    tcpSkt = new QTcpSocket();
    connect(tcpSkt, SIGNAL(connected()), this, SLOT(when_tcpConnected()));//與TCP服務器連接成功
    connect(tcpSkt, SIGNAL(disconnected()), this, SLOT(when_tcpDisConnected()));//tcp掉線
    connect(tcpSkt, SIGNAL(readyRead()), this, SLOT(when_tcpReceivedData()));//tcp客戶端接收到了數據
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_ptnLink_clicked()
{
    QHostAddress serverIp;
    if(!serverIp.setAddress(ui->lineEditServerIP->text()))
       debug_print("你輸入的服務器IP有誤");

    tcpSkt->close();
    tcpSkt->connectToHost(serverIp, ui->spinPort->value());
}

void MainWindow::when_tcpConnected()
{
    debug_print("已連接到TCP服務器");
}

void MainWindow::when_tcpDisConnected()
{
    debug_print("與TCP服務器的連接已斷開");
}

void MainWindow::when_tcpReceivedData()
{
    QByteArray ba;
    ba = tcpSkt->readAll();
    debug_print(QString(ba));
}

void MainWindow::on_ptnSend_clicked()
{

    char*  ch;
    QByteArray ba = ui->lineEditSend->text().toLatin1(); // must
    ch=ba.data();

    tcpSkt->write(ch, ba.size());
}

 

爲了測試上述程序,用到了網絡調試助手SSCOM,

把sscom設置成TCP服務器模式,並進入監聽狀態。然後點擊我的軟件的【發起連接申請按鈕】,在窗口就會看到”已連接到TCP服務器“。點擊SSCOM中的斷開按鈕,在我的軟件中會看到”與TCP服務器的連接已斷開“的提示。

我的軟件與SSCOM互相收發數據,經測試也沒問題。

SSCOM的設置以及測試畫面如下:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章