首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP,就是开放式、无连接、不可靠的传输层通信协议。
下面,我一次进行客户端和服务器端的QT实现。我的开发环境是:QT Creator 5.7。
先看下效果图:
一:客户端编程
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