服務器端的操作是,建立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的設置以及測試畫面如下: