第三步,实现TcpClient的通信功能。
C:\Users\Minwei\Projects\Qt\TcpClient\tcpclientwindow.h:
xxxxxxxxxx
441
2
3
4
5
6
7
8QT_BEGIN_NAMESPACE
9namespace Ui { class TcpClientWindow; }
10QT_END_NAMESPACE
11
12class TcpClientWindow : public QMainWindow
13{
14 Q_OBJECT
15
16public:
17 TcpClientWindow(QWidget *parent = nullptr);
18 ~TcpClientWindow();
19
20private slots:
21 void on_m_actConnect_triggered();
22 void on_m_actDisconnect_triggered();
23 void on_m_actClear_triggered();
24
25 void on_m_btnSend_clicked();
26
27 void on_m_socket_connected();
28 void on_m_socket_readyRead();
29 void on_m_socket_disconnected();
30
31 void on_m_socket_stateChanged(
32 QAbstractSocket::SocketState socketState);
33 void on_m_socket_error(
34 QAbstractSocket::SocketError socketError);
35
36private:
37 Ui::TcpClientWindow *ui;
38 QLabel* m_labConnectionState;
39 QLabel* m_labSocketState;
40 QLabel* m_labSocketError;
41 QTcpSocket* m_socket;
42};
43
44// TCPCLIENTWINDOW_H
C:\Users\Minwei\Projects\Qt\TcpClient\tcpclientwindow.cpp:
x
1
2
3
4
5
6
7TcpClientWindow::TcpClientWindow(QWidget *parent)
8 : QMainWindow(parent)
9 , ui(new Ui::TcpClientWindow)
10 , m_labConnectionState(new QLabel("连接状态:断开"))
11 , m_labSocketState(new QLabel(" 套接字状态:"))
12 , m_labSocketError(new QLabel(" 套接字错误:"))
13 , m_socket(new QTcpSocket(this))
14{
15 ui->setupUi(this);
16
17 m_labConnectionState->setMinimumWidth(196);
18 ui->m_statusBar->addWidget(m_labConnectionState);
19 m_labSocketState->setMinimumWidth(197);
20 ui->m_statusBar->addWidget(m_labSocketState);
21 m_labSocketError->setMinimumWidth(197);
22 ui->m_statusBar->addWidget(m_labSocketError);
23
24 connect(m_socket, SIGNAL(connected()),
25 this, SLOT(on_m_socket_connected()));
26 connect(m_socket, SIGNAL(readyRead()),
27 this, SLOT(on_m_socket_readyRead()));
28 connect(m_socket, SIGNAL(disconnected()),
29 this, SLOT(on_m_socket_disconnected()));
30
31 connect(m_socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
32 this, SLOT(on_m_socket_stateChanged(QAbstractSocket::SocketState)));
33 connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)),
34 this, SLOT(on_m_socket_error(QAbstractSocket::SocketError)));
35}
36
37TcpClientWindow::~TcpClientWindow()
38{
39 delete ui;
40}
41
42void TcpClientWindow::on_m_actConnect_triggered()
43{
44 m_socket->connectToHost(ui->m_editRemoteAddr->text(),
45 ui->m_editRemotePort->text().toUShort());
46}
47
48void TcpClientWindow::on_m_actDisconnect_triggered()
49{
50 m_socket->disconnectFromHost();
51}
52
53void TcpClientWindow::on_m_actClear_triggered()
54{
55 ui->m_editOutput->clear();
56}
57
58void TcpClientWindow::on_m_btnSend_clicked()
59{
60 QByteArray data((ui->m_editSend->text() + "\n").toUtf8());
61
62 qint64 nbytes = m_socket->write(data);
63
64 if (nbytes == -1)
65 ui->m_editOutput->appendPlainText("发送失败");
66 else
67 ui->m_editOutput->appendPlainText(QString("向%1:%2发送%3字节:%4").
68 arg(m_socket->peerAddress().toString()).arg(m_socket->peerPort()).
69 arg(nbytes).arg(QString(data).trimmed()));
70}
71
72void TcpClientWindow::on_m_socket_connected()
73{
74 ui->m_editOutput->appendPlainText(QString("建立%1:%2连接").
75 arg(m_socket->peerAddress().toString()).arg(m_socket->peerPort()));
76 m_labConnectionState->setText(QString("连接状态:%1:%2").
77 arg(m_socket->peerAddress().toString()).arg(m_socket->peerPort()));
78
79 ui->m_btnSend->setEnabled(true);
80}
81
82void TcpClientWindow::on_m_socket_readyRead()
83{
84 while (m_socket->canReadLine())
85 {
86 QByteArray data = m_socket->readLine();
87
88 ui->m_editOutput->appendPlainText(QString("从%1:%2接收%3字节:%4").
89 arg(m_socket->peerAddress().toString()).arg(m_socket->peerPort()).
90 arg(data.size()).arg(QString(data).trimmed()));
91 }
92}
93
94void TcpClientWindow::on_m_socket_disconnected()
95{
96 ui->m_btnSend->setEnabled(false);
97
98 ui->m_editOutput->appendPlainText(QString("断开%1:%2连接").
99 arg(m_socket->peerAddress().toString()).arg(m_socket->peerPort()));
100 m_labConnectionState->setText("连接状态:断开");
101}
102
103void TcpClientWindow::on_m_socket_stateChanged(
104 QAbstractSocket::SocketState socketState)
105{
106 m_labSocketState->setText(QString(" 套接字状态:%1").arg(
107 QMetaEnum::fromType<QAbstractSocket::SocketState>().
108 valueToKey(socketState)));
109}
110
111void TcpClientWindow::on_m_socket_error(
112 QAbstractSocket::SocketError socketError)
113{
114 m_labSocketError->setText(QString(" 套接字错误:%1").arg(
115 QMetaEnum::fromType<QAbstractSocket::SocketError>().
116 valueToKey(socketError)));
117}
运行效果如图所示: