Qt 5 . 7 文档翻译:QAbstractSocket类,QAbstractSocket Class
QAbstractSocket 类,实现了所有套接字类型对象公用的基础功能。 详细说明……
头文件: |
#include <QAbstractSocket> |
qmake指令: |
QT += network |
继承: |
|
被以下类继承: |
注意 : 这个类中的所有函数都是 可重入的 。
QAbstractSocket 类,实现了所有套接字类型对象公用的基础功能。
QAbstractSocket 是 QTcpSocket 和 QUdpSocket 的基类,实现 了这两个类共用的基础功能。如果 妳想使用套接字,那么,妳有两种选项:
•. 实例 化 QTcpSocket 或 QUdpSocket 。
•. 创建 一个原生的套接字描述符,实例化 QAbstractSocket ,然后调用 setSocketDescriptor ()以便包装这个原生套接字。
传输控制协议(TCP (Transmission Control Protocol)),是可靠的、面向流的、面向连接的传输层协议。用户数据报协议(UDP (User Datagram Protocol)),是不可靠的、面向数据包的、无连接的协议。从实用角度来说,这就意味着,TCP更适合于连续传输数据,而更轻量级的UDP就可用于可靠性不那么重要的场景。
QAbstractSocket 的应用编程接口,将两个协议之间大部分差别都统一了。比如 说,尽管 UDP 是无连接的,但是, connectToHost () 可以为UDP 套接字建立一个虚拟连接,使得 妳能够在一定程度上忽略底层 协议的不同,以一种比较统一的方式来使用 QAbstractSocket 。 在内部实现中, QAbstractSocket 会记录下传递给 connectToHost ()的地址和端口,之后, 像 read ()和 write ()这样的函数就会使用那些值。
任何时候 , QAbstractSocket 都有一个确定的状态 ( 由 state ()函数返回 ) 。最初状态 是 UnconnectedState 。 在调用 connectToHost ()之后,套接字就进入 HostLookupState 状态。找到 主机之后, QAbstractSocket 进入 ConnectingState 状态 ,并且发射 hostFound ()信号。 当连接建立之后,它就进入 ConnectedState 状态,并且发射 connected ()信号。如果 在任何时候发生了错误,则会发射 error ()信号。每当状态 发生改变时,就会发射 stateChanged ()信号。 为了方便使用,提供了 isValid ()函数,当套接字已经可以被读取数据及写入数据时,该函数会返回真( true ),但是,请注意 ,套接字必须 要 进入 ConnectedState 状态 , 才能够 真正开始读取和写入。
通过调用 read () 或 write ()来读取或写入数据,或者,可使用便利函数 readLine ()和 readAll ()。 QAbstractSocket 还从 QIODevice 继承了 getChar () 、 putChar () 和 ungetChar (),这些函数对单个字节进行操作。 当有数据被写入到套接字中去时,会发射 bytesWritten ()信号。注意 , Qt 并不限制写入缓冲区的大小。 妳可通过监听这个信号来监视缓冲区的大小。
每当 有新的数据块到达时,就会发射 readyRead ()信号。然后 , bytesAvailable () 会返回可供读取的数据的字节数。典型 的用法中,应当将 readyRead ()信号连接 到某个信号槽,并在那个信号槽中读取所有可用的数据。如果 妳没有一次性将所有数据读取的话,那么,剩下的数据仍然可以在日后读取,并且, 新到达的数据都会被追加到 QAbstractSocket 的内部读取缓冲区中。 要想限制读取缓冲区的大小,则调用 setReadBufferSize ()。
要关闭该套接字,则调用 disconnectFromHost ()。 QAbstractSocket 就会进入 QAbstractSocket::ClosingState 状态。 当队列中所有数据都被写入到套接字之后, QAbstractSocket 才真正关闭该套接字,进入QAbstractSocket::ClosedState 状态,并且发射 disconnected ()信号。如果 妳想要抛弃所有尚未写入 的数据,立即断开连接的话,则应当调用 abort ()。如果对端 主机关闭了连接,那么, QAbstractSocket 会发射 error( QAbstractSocket::RemoteHostClosedError )信号 ,在这个过程中套接字的状态仍然是 ConnectedState ,然后,会发射 disconnected ()信号。
可调用 peerPort ()和 peerAddress ()来获取到当前连接的对端节点的端口和地址。 peerName () ,返回对端节点的主机名,也就是之前传递给 connectToHost ()的名字。 localPort () 和 localAddress () ,返回本地套接字的端口和地址。
QAbstractSocket 提供 了一组函数,它们会阻塞当前线程,直到特定的信号被发射为止。 这些函数,可用来实现阻塞式的套接字功能:
•. waitForConnected () ,阻塞,直到连接建立成功为止。
•. waitForReadyRead () ,阻塞,直到 有新的数据可供读取为止。
•. waitForBytesWritten () ,阻塞,直到有数据被写入到套接字为止。
•. waitForDisconnected () ,阻塞,直到连接关闭为止。
以下是一个示例:
int numRead = 0, numReadTotal = 0;
char buffer[50];
forever {
numRead = socket.read(buffer, 50);
// 对刚 读入的数组做该做的事
numReadTotal += numRead;
if (numRead == 0 && !socket.waitForReadyRead())
break;
}
如果 waitForReadyRead() 返回 假(false),则表明,连接已经被关闭,或者发生了错误。
针对阻塞 式套接字编程,相比于针对非阻塞式套接字编程,是完全不同的。阻塞 式套接字,不需要有事件循环的存在,因而一般来说可以写出较简单的代码。然而 ,在图形用户界面的应用程序里,只能 在非图形用户界面的线程中使用阻塞式套接字,以避免冻结住用户界面。 参考 fortuneclient 和 blockingfortuneclient 示例,以同时了解两种不同实现方式。
注意 : 我们反对将阻塞式函数和信号一起使用。应当使用其中一种。
QAbstractSocket 可与 QTextStream 和 QDataStream 的流式操作符(operator<<() and operator>>())配套使用。 不过,有一个问题需要注意: 妳需要先确保有足够多的数据存在,才能使用operator>>()来读取它。
参考 QNetworkAccessManager 和 QTcpServer 。
这个枚举说明的是可能出现的套接字错误。
常量 |
值 |
说明 |
QAbstractSocket::ConnectionRefusedError |
0 |
对方拒绝连接(或者连接超时)。 |
QAbstractSocket::RemoteHostClosedError |
1 |
对方主机关闭咯连接。注意,客户端套接字(也就是此套接字)会在发送完远程主机关闭连接这一通知之后关闭。 |
QAbstractSocket::HostNotFoundError |
2 |
未找到指定的主机地址。 |
QAbstractSocket::SocketAccessError |
3 |
套接字操作失败,因为此程序不具有对应的权限。 |
QAbstractSocket::SocketResourceError |
4 |
本机的系统资源不足(例如,打开的套接字太多)。 |
QAbstractSocket::SocketTimeoutError |
5 |
套接字操作超时。 |
QAbstractSocket::DatagramTooLargeError |
6 |
数据报超过咯操作系统的限制(这一限制最少可能达到8192 字节)。 |
QAbstractSocket::NetworkError |
7 |
网络本身出错(例如,网线突然被拔出)。 |
QAbstractSocket::AddressInUseError |
8 |
提供给 QAbstractSocket::bind ()的地址已经在使用当中,并且被设置成独占的。 |
QAbstractSocket::SocketAddressNo tAvailableError |
9 |
提供给 QAbstractSocket::bind ()的地址不属于此主机。 |
QAbstractSocket::UnsupportedSocketOperationError |
10 |
所请求的套接字操作在本地的操作系统中不被支持(例如,不支持IPv6)。 |
QAbstractSocket::ProxyAuthenticationRequiredError |
12 |
这个套接字正在使用代理,而代理服务器要求进行认证。 |
QAbstractSocket::SslHandshakeFailedError |
13 |
SSL/TLS 握手过程失败,因此连接被关闭(只在 QSslSocket 中使用) |
QAbstractSocket::UnfinishedSocketOperationError |
11 |
只被QAbstractSocketEngine 使用。上一个操作还没结束(仍然在后台进行)。 |
QAbstractSocket::ProxyConnectionRefusedError |
14 |
无法与代理服务器通信,因为它拒绝连接。 |
QAbstractSocket::ProxyConnectionClosedError |
15 |
与代理服务器的连接被突然(在连接到最终目的节点之前)关闭。 |
QAbstractSocket::ProxyConnectionTimeoutError |
16 |
与代理服务器之间的连接超时,或者代理服务器在处于认证阶段时停止响应。 |
QAbstractSocket::ProxyNotFoundError |
17 |
无法找到通过setProxy()设置的代理地址(或者程序本身的代理地址)。 |
QAbstractSocket::ProxyProtocolError |
18 |
与代理服务器之间的连接协商过程失败,因为代理服务器的回复内容是无法理解的。 |
QAbstractSocket::OperationError |
19 |
尝试进行某个操作,而套接字本身处于一种不允许该操作的状态。 |
QAbstractSocket::SslInternalError |
20 |
所使用的SSL库报告了一个内部错误。这一般是因为那个库的安装不正确或者配置不正确。 |
QAbstractSocket::SslInvalidUserDataError |
21 |
提供了无效的数据(证书、密钥、加密算法等等),结果导致了SSL 库中发生错误。 |
QAbstractSocket::TemporaryError |
22 |
发生了临时错误(例如,该操作会阻塞,而套接字本身是非阻塞的)。 |
QAbstractSocket::UnknownSocketError |
-1 |
未知错误。 |
参考 QAbstractSocket::error () 。
这个枚举描述的是一个套接字可能存在的不同状态。
常量 |
值 |
说明 |
QAbstractSocket::UnconnectedState |
0 |
这个套接字没有连接。 |
QAbstractSocket::HostLookupState |
1 |
这个套接字正在进行域名解析。 |
QAbstractSocket::ConnectingState |
2 |
这个套接字已经开始建立连接。 |
QAbstractSocket::Connected State |
3 |
已经建立连接。 |
QAbstractSocket::BoundState |
4 |
这个套接字已经绑定到一个地址和端口。 |
QAbstractSocket::ClosingState |
6 |
这个套接字即将关闭(可能还有数据要发送)。 |
QAbstractSocket::ListeningState |
5 |
这个值是内部使用的。 |
参考 QAbstractSocket::state () 。
使用给定的绑定模式( BindMode ) mode 来绑定到地址 address 的端口 port 。
将这个套接字绑定到地址 address 的端口 port 。
对于UDP 套接字,当绑定后,每当 有 UDP 数据包到达指定的地址和端口时,就会发射 QUdpSocket::readyRead ()信号。所以 ,这个函数可用于编写UDP 服务器。
对于TCP套接字,可使用这个函数来指定要用哪个网卡发起向外的连接,在多网卡的环境下狠有用。
默认情况 下,该套接字会使用 DefaultForPlatform 这个绑定模式( BindMode )来绑定。如果 未指定端口号,则会选择一个随机的端口号。
如果绑定成功, 则这个函数会返回真( true ),并且该套接字会进入 BoundState 状态;否则 将返回假( false )。
此函数是从Qt 5.0 开始引入的。
覆盖 了 QIODevice::close ()。
关闭为此套接字打开的输入/输出设备,断开此套接字与对方主机的连接,关闭套接字,重置主机名、地址、端口号和底层的套接字描述符。
参考 QIODevice::close (),以了解当一个输入/输出设备被关闭时会产生什么动作。
参考 abort () 。
在调用 connectToHost ()之后,当主机名的域名解析成功之后,会发射这个信号。
注意 : 从Qt 4.6.3开始, QAbstractSocket 可能会在 connectToHost ()被调用时直接发射出hostFound()信号,因为对应的DNS结果可能已经存在于缓存中了。
参考 connected ()。
使用平台原生 的套接字描述符 socketDescriptor 来初始化 QAbstractSocket 。 如果 socketDescriptor 被当成一个有效的套接字描述符接受了,则返回真( true );否则返回 假( false )。 该套接字会以 openMode 模式打开,并且进入指定的 socketState 状态。读取 和写入缓冲区会被清空,会忽略掉任何队列数据。
注意 :无法使用同一个原生套接字描述符来初始化两个抽象套接字对象。
参考 socketDescriptor () 。
返回此套接字的状态。
参考 error () 。
覆盖 QIODevice::waitForReadyRead ()。
这个函数会阻塞,直到发生这个情况:有新的数据到达,并且发射咯 readyRead() 信号。这个函数会在 msecs 毫秒之后超时;默认的超时时间是30000 毫秒。
如果 readyRead ()信号被发射,并且有新的数据可读的话,则此函数会返回真;否则它会返回假(可能是因为出错,也可能是因为此操作超时)。
参考 waitForBytesWritten () 。
http://item.jd.com/10813343.html
Cute Girls
地铁偷摸
未知美人
未知美人
Your opinionsHxLauncher: Launch Android applications by voice commands