QAbstractSocket
是 Qt 网络模块中的一个抽象基类,提供了对 TCP 和 UDP 套接字的基本操作。它是 QTcpSocket
和 QUdpSocket
的父类,封装了套接字的核心功能。以下是对 QAbstractSocket
类中主要方法的详细说明和代码示例。
1. 构造函数与析构函数
QAbstractSocket(QAbstractSocket::SocketType socketType, QObject *parent)
- 功能:构造一个
QAbstractSocket
对象。 - 参数:
socketType
:套接字类型(如QTcpSocket
或QUdpSocket
)。parent
:父对象(用于 Qt 对象树管理)。
- 示例:
QTcpSocket *tcpSocket = new QTcpSocket(this); // 创建一个 TCP 套接字
virtual ~QAbstractSocket()
- 功能:析构函数,释放套接字资源。
- 示例:
delete tcpSocket; // 释放套接字对象
2. 绑定与连接
virtual bool bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
- 功能:将套接字绑定到指定的地址和端口。
- 参数:
address
:绑定的 IP 地址。port
:绑定的端口号(0 表示自动分配)。mode
:绑定模式(如DefaultForPlatform
、ReuseAddressHint
等)。
- 返回值:绑定成功返回
true
,否则返回false
。 - 示例:
QUdpSocket udpSocket; if (udpSocket.bind(QHostAddress::Any, 12345)) { qDebug() << "UDP socket bound to port 12345"; }
bool bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
(since Qt 6.2)
- 功能:将套接字绑定到指定的端口(使用默认地址)。
- 示例:
QUdpSocket udpSocket; if (udpSocket.bind(12345)) { qDebug() << "UDP socket bound to port 12345"; }
bool bind(QHostAddress::SpecialAddress addr, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
- 功能:将套接字绑定到特殊地址(如
QHostAddress::LocalHost
)。 - 示例:
QUdpSocket udpSocket; if (udpSocket.bind(QHostAddress::LocalHost, 12345)) { qDebug() << "UDP socket bound to localhost:12345"; }
virtual void connectToHost(const QString &hostName, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
- 功能:连接到指定的主机和端口。
- 参数:
hostName
:主机名或 IP 地址。port
:端口号。openMode
:打开模式(如ReadWrite
)。protocol
:网络协议(如IPv4Protocol
或IPv6Protocol
)。
- 示例:
QTcpSocket tcpSocket; tcpSocket.connectToHost("example.com", 80); if (tcpSocket.waitForConnected()) { qDebug() << "Connected to example.com:80"; }
void connectToHost(const QHostAddress &address, quint16 port, QIODeviceBase::OpenMode openMode = ReadWrite)
- 功能:连接到指定的 IP 地址和端口。
- 示例:
QTcpSocket tcpSocket; tcpSocket.connectToHost(QHostAddress("192.168.1.1"), 8080);
virtual void disconnectFromHost()
- 功能:断开与主机的连接。
- 示例:
tcpSocket.disconnectFromHost();
3. 错误与状态
QAbstractSocket::SocketError error() const
- 功能:返回最后一次发生的错误。
- 示例:
if (tcpSocket.error() == QAbstractSocket::ConnectionRefusedError) { qDebug() << "Connection refused"; }
bool isValid() const
- 功能:检查套接字是否有效。
- 示例:
if (tcpSocket.isValid()) { qDebug() << "Socket is valid"; }
QAbstractSocket::SocketState state() const
- 功能:返回套接字的当前状态(如
ConnectedState
、UnconnectedState
)。 - 示例:
if (tcpSocket.state() == QAbstractSocket::ConnectedState) { qDebug() << "Socket is connected"; }
4. 地址与端口
QHostAddress localAddress() const
- 功能:返回套接字的本地地址。
- 示例:
qDebug() << "Local address:" << tcpSocket.localAddress();
quint16 localPort() const
- 功能:返回套接字的本地端口。
- 示例:
qDebug() << "Local port:" << tcpSocket.localPort();
QHostAddress peerAddress() const
- 功能:返回对等方的地址。
- 示例:
qDebug() << "Peer address:" << tcpSocket.peerAddress();
quint16 peerPort() const
- 功能:返回对等方的端口。
- 示例:
qDebug() << "Peer port:" << tcpSocket.peerPort();
5. 缓冲区与数据操作
virtual void setReadBufferSize(qint64 size)
- 功能:设置读取缓冲区的大小。
- 示例:
tcpSocket.setReadBufferSize(1024 * 1024); // 设置缓冲区为 1MB
qint64 readBufferSize() const
- 功能:返回读取缓冲区的大小。
- 示例:
qDebug() << "Read buffer size:" << tcpSocket.readBufferSize();
bool flush()
- 功能:刷新套接字的写缓冲区。
- 示例:
tcpSocket.flush();
6. 其他功能
void abort()
- 功能:立即关闭套接字并丢弃所有未发送的数据。
- 示例:
tcpSocket.abort();
virtual bool waitForConnected(int msecs = 30000)
- 功能:等待套接字连接,最多等待
msecs
毫秒。 - 示例:
if (tcpSocket.waitForConnected(5000)) { qDebug() << "Connected!"; }
virtual bool waitForDisconnected(int msecs = 30000)
- 功能:等待套接字断开连接,最多等待
msecs
毫秒。 - 示例:
if (tcpSocket.waitForDisconnected(5000)) { qDebug() << "Disconnected!"; }
总结
QAbstractSocket
提供了丰富的功能,用于管理套接字连接、数据传输和错误处理。通过其子类 QTcpSocket
和 QUdpSocket
,开发者可以轻松实现 TCP 和 UDP 的网络通信。