简述

QLocalSocket类提供了一个本地socket。

在Windows中,这是一个命名管道;在Unix中,这是一个本地网域socket。

如果发生错误,socketError()会返回错误的类型,errorString()则返回人类可读的错误描述。

虽然QLocalSocket是一个事件循环使用而设计,它也可以不被如此使用。这种情况下,必须使用 
waitForConnected()、waitForReadyRead()、waitForBytesWritten()、和waitForDisconnected()来进行阻塞,直到操作完成或超时。

  • 简述
  • 成员类型文档
  • Public函数
  • 信号
  • 重新实现的Public函数
  • 重新实现的Protected函数

成员类型文档

枚举 QLocalSocket::LocalSocketError

LocalServerError枚举代表了可能发生的错误,最近的错误可以通过调用QLocalSocket::error()来获取。

常量 描述
QLocalSocket::ConnectionRefusedError QAbstractSocket::ConnectionRefusedError 连接被对方拒绝(或超时)
QLocalSocket::PeerClosedError QAbstractSocket::RemoteHostClosedError 远程socket关闭了连接。请注意,在远程关闭通知发送后,client socket(即,这个socket)将关闭。
QLocalSocket::ServerNotFoundError QAbstractSocket::HostNotFoundError 本地socket名字没有被发现
QLocalSocket::SocketAccessError QAbstractSocket::SocketAccessError socket操作失败,因为应用程序缺乏必要的特权。
QLocalSocket::SocketResourceError QAbstractSocket::SocketResourceError 本地系统超出资源(例如:太多的socket)
QLocalSocket::SocketTimeoutError QAbstractSocket::SocketTimeoutError socket操作超时。
QLocalSocket::DatagramTooLargeError QAbstractSocket::DatagramTooLargeError 数据报比操作系统的限制(可低至8192字节)大。
QLocalSocket::ConnectionError QAbstractSocket::NetworkError 连接时发生错误
QLocalSocket::UnsupportedSocketOperationError QAbstractSocket::UnsupportedSocketOperationError 本地操作系统不支持请求的socket操作
QLocalSocket::OperationError QAbstractSocket::OperationError 当socket在一个不允许它的状态中时,试图进行操作。
QLocalSocket::UnknownSocketError QAbstractSocket::UnknownSocketError 发生无法识别的错误

枚举 QLocalSocket::LocalSocketState

这个枚举描述一个套接字的不同状态。

常量 描述
QLocalSocket::UnconnectedState QAbstractSocket::UnconnectedState socket未连接
QLocalSocket::ConnectingState QAbstractSocket::ConnectingState socket已开始建立连接
QLocalSocket::ConnectedState QAbstractSocket::ConnectedState 建立连接
QLocalSocket::ClosingState QAbstractSocket::ClosingState socket即将关闭(数据仍可以等待写入)

Public函数

void abort()

终止当前连接,并重置socket。与disconnectFromServer()不同,此函数会立即关闭socket,并且清除掉写缓冲区中未处理的数据。

void connectToServer(OpenMode openMode = ReadWrite)

尝试创建一个到serverName()的连接。在打开连接之前必须调用setServerName();或者可以使用connectToServer(const QString &name, OpenMode openMode)。

以指定的openMode打开socket,首先进入ConnectingState,如果建立了连接,QLocalSocket进入ConnectedState,并发射connected()信号。

调用此函数后,当发生错误时,socket会发射error()信号。

void connectToServer(const QString &name, OpenMode openMode = ReadWrite)

重载函数

void disconnectFromServer()

尝试关闭socket。如果缓冲区中仍有等待写入的数据,QLocalSocket将进入ClosingState状态,然后等待,直到所有数据写完。最终,QLocalSocket进入UnconnectedState状态,发射disconnectedFromServer()信号。

LocalSocketError error() const

返回最后发生的错误类型。

bool flush()

此函数能够无阻塞地将内部写缓冲区中的数据尽可能多的写入到socket中。当有任何数据被写入时,返回true;否则返回false。 
当需要QLocalSocket立即发送缓冲区中的数据时,可以调用此函数。成功写入的字节数取决于操作系统。在大多数情况下,不需要调用该函数,因为一旦事件循环得到了控制权之后,QLocalSocket就会自动的开始发送数据。当没有事件循环时,调用waitForBytesWritten()代替。

QString fullServerName() const

返回socket连接到的server path。

注意:返回值因操作系统不同存在差异。

bool isValid() const

如果socket是有效的并且并且可以使用了,返回ture;否则返回false。

注意: socket进行读/写之前,一定是处于ConnectedState状态。

qint64 readBufferSize() const

返回内部读取缓冲区的大小。在调用read()或readAll()之前,这限制了client接收的数据量。读缓冲区大小为0(默认)意味着缓冲区没有大小限制,确保没有数据丢失。

QString serverName() const

返回由setServerName()指定的server的name。如果没有调用setServerName(),或者connectToServer()失败,返回空字符串。

void setReadBufferSize(qint64 size)

设置QLocalSocket内部读缓冲区的大小为size个字节。

如果缓冲区被限制为一定的大小,QLocalSocket不会缓冲超过这个数据的大小。

如果设置了指定的size,QLocalSocket最多只能缓存该size大小的数据。特殊地,大小为0的缓冲区意味着读缓冲区是无限的,并且所有传入数据都会得到缓冲,这是默认的。

如果你只在特定的时间点(例如:在一个实时流媒体应用程序)读数据,或者想保护你的socket避免接收太多的数据(这最终可能会导致应用程序耗尽内存),这个选项是有用的。

void setServerName(const QString &name)

设置对等连接的名称。在Windows中,名字是命名管道的名称;在Unix中,名称是本地域socket的名称。 
当未连接socket时,此函数必须被调用。

bool setSocketDescriptor(qintptr socketDescriptor, LocalSocketState socketState = ConnectedState, OpenMode openMode = ReadWrite)

使用本地socket描述符socketDescriptor完成QLocalSocket的初始化。如果socketDescriptor被接受为一个有效的socket描述符,返回true;否则返回false。socket被以指定的模式openMode打开,并进入socketState指定的socket状态。

注意:无法使用相同的本地socket描述符来初始化两个本地socket。

qintptr socketDescriptor() const

如果可用,返回QLocalSocket对象的本地socket描述符。否则,返回-1。

当QLocalSocket处于UnconnectedState状态时,socket描述符无效。

LocalSocketState state() const

返回socket的状态。

bool waitForConnected(int msecs = 30000)

等待,直到socket连接。直到msecs毫秒。如果连接已建立,返回true;否则返回false。返回false时,可以调用error()来确定错误的原因。

下面的例子最多等待1秒来建立连接:

socket->connectToServer("market");
if (socket->waitForConnected(1000)) qDebug("Connected!");
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

如果msecs是-1,该函数不会超时。

bool waitForDisconnected(int msecs = 30000)

等待,直到socket断开。直到msecs毫秒。如果连接已断开,返回true;否则返回false。返回false时,可以调用error()来确定错误的原因。

下面的例子最多等待1秒来断开连接:

socket->disconnectFromServer();
if (socket->waitForDisconnected(1000))qDebug("Disconnected!");
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

如果msecs是-1,该函数不会超时。

信号

void connected()

调用connectToServer()之后,并且成功建立连接,发射此信号。

void disconnected()

当socket已经断开连接,发射此信号。

void error(QLocalSocket::LocalSocketError socketError)

当有错误发生时,会发射此信号。参数socketError表明发生错误的类型。

QLocalSocket::LocalSocketError不是一个注册的metatype,所以在queued connections时,需要使用Q_DECLARE_METATYPE()和qRegisterMetaType()注册它。

**注意:**error是这个类的一个重载信号。要连接这个信号,需要使用函数指针语法,必须在static_cast中指定信号类型,如本例所示:

connect(localSocket, static_cast<void(QLocalSocket::*)(QLocalSocket::LocalSocketError)>(&QLocalSocket::error), [=](QLocalSocket::LocalSocketError socketError){ /* ... */ });
  • 1
  • 1

void stateChanged(QLocalSocket::LocalSocketState socketState)

当QLocalSocket的状态改变时,发射此信号。参数socketState是新状态。

QLocalSocket::SocketState不是一个注册的metatype,所以在queued connections时,需要使用Q_DECLARE_METATYPE()和qRegisterMetaType()注册它。

重新实现的Public函数

[virtual] qint64 bytesAvailable() const

重新实现QIODevice::bytesAvailable()。

[virtual] qint64 bytesToWrite() const

重新实现QIODevice::bytesToWrite()。

[virtual] bool canReadLine() const

重新实现QIODevice::canReadLine()。

[virtual] void close()

重新实现QIODevice::close()。

[virtual] bool isSequential() const

重新实现QIODevice::isSequential()。

[virtual] bool waitForBytesWritten(int msecs = 30000)

重新实现QIODevice::waitForBytesWritten()。

[virtual] bool waitForReadyRead(int msecs = 30000)

重新实现QIODevice::waitForReadyRead()。

此函数阻塞,直到数据可供阅读并且readyRead()信号被发射。在msecs毫秒后,就会超时;默认的超时时间为30000毫秒。

如果数据可供阅读,该函数返回true;否则返回false(如果发生错误或操作超时)。

[virtual] bool open(OpenMode openMode = ReadWrite)

重新实现QIODevice::open()。

相当于connectToServer(OpenMode mode),以指定的openMode打开socket至setServerName()定义的server。

注意:不像其他大多数的QIODevice子类,open()可以不直接打开设备。如果socket已连接或server连接到没有定义,该函数返回false,其他情况返回true。一旦设备打开(或连接失败),就会发射信号connected()或error()。

重新实现的Protected函数

qint64 readData(char *data, qint64 c)

重新实现QIODevice::readData()。

qint64 writeData(const char *data, qint64 c)

重新实现QIODevice::writeData()。

转自:http://blog.csdn.net/liang19890820/article/details/52352192

Qt之QLocalSocket相关推荐

  1. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  2. Qt应用程序只运行一个实例

    在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...

  3. 记录一次定位视频通话 音视频卡顿的原因分析过程。

    背景: 我们组开发一个了跨平台(Web, Windows, Linux, Android, iOS)的音视频对讲.会议SDK.应用开发组基于此SDK开发Web版, PC, Android, iOS版客 ...

  4. Qt QLocalSocket 进程间通信

    简述 QIODevice 做为QLocalSocket的父类,我们先做一下简单的介绍 QIODevice类是Qt中所有输入/输出设备的基本接口类. QIODevice为支持读取和写入数据块的设备提供了 ...

  5. C++ QT QLocalSocket/QLocalServer基操

    以下是使用QLocalSocket/QLocalServer进行进程间通信的具体用法: 1. 创建QLocalServer 在服务端进程中,需要创建一个QLocalServer对象,并监听客户端连接. ...

  6. 【Qt】Qt再学习(七):QLocalServer、QLocalSocket

    1.QLocalServer QLocalServer类提供基于本地套接字的服务器. 简单的使用方法:首先创建本地服务器并监听 QLocalServer* server = new QLocalSer ...

  7. QLocalServer与QLocalSocket进程通讯

    在Qt中,提供了多种IPC方法,作者所用的是QLocalServer和QLocalSocket.看起来好像和Socket搭上点边,实则底层是windows的name pipe.这应该是支持双工通信的. ...

  8. Qt运行一个实例进程

    在开发项目的工程中,我们经常希望只运行一个相同的Qt实例进程.当然也可以像类似QQ那样,同时登录多个不同的账号!为了避免这个问题,介绍以下几种用法,每一个解决方案都适用于特定的情况,所以必须尝试和适用 ...

  9. Qt多线程 TCP 服务端

    Qt实现 多线程 TCP 服务端 因为项目中要用到TCP客户端的并发处理,所以TCP服务端用多线程去实现是必要的.于是花了一大早上的时间写了一各Demo 如图: 主要关键代码: 关于线程的处理.关于线 ...

最新文章

  1. 使用c++filt查看trafficserver堆栈调用信息
  2. Journey源码分析三:模板编译
  3. python_bomb----函数高级特性(生成器)
  4. java读写锁降级_java的读写锁中锁降级的问题
  5. [Java] Welcome to Artifactory 使用说明
  6. Linux中crontab无法执行java程序的问题
  7. oracle实现序列,oracle中创建序列和自增长列的实现方式
  8. python中哪些是无序_Python笔记 【无序】 【三】
  9. Easystructure教程_C语言源代码自动生成流程图
  10. linux mysql优化_Linux上跑MySQL优化技巧
  11. 【算法笔记】扩展kmp算法(exkmp)
  12. 数据库面试题---原理
  13. 寻找春天nbsp;九宫格日记-2011.04.17
  14. 什么是光纤?光纤有哪些优势?
  15. 微信公众号html在线编辑器,【微信公众平台工具开发】雷人微信网页编辑器
  16. 什么是ISO 21434?给汽车软件开发人员的合规贴士
  17. 针对python代码下载youtub视屏报错修复
  18. 使用Flexible.js实现手机端网页内容适配(rem适配法)
  19. 100 道 Linux 常见面试题,建议收藏!
  20. 智能硬件产品盈利模式

热门文章

  1. 为什么我要构建这个脚手架
  2. JAVA 手机号正则 工具类
  3. win7桌面便签。自带的
  4. 命令行上的narrowing(随着输入逐步减少备选项)工具
  5. Scala类型系统的目的——Martin Odersky访谈(三)
  6. Python 更新set
  7. trafficserver records.config参数说明
  8. RPC Over HTTPS 访问Exchange 邮箱
  9. discuz! 7.2 manyou插件暴路径Get Webshell 0day
  10. 如何提高JVM的性能?