Qt之QLocalSocket

简述

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!");

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

bool waitForDisconnected(int msecs = 30000)

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

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

socket->disconnectFromServer();
if (socket->waitForDisconnected(1000))
    qDebug("Disconnected!");

如果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){ /* ... */ });

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()。

时间: 2024-12-31 13:48:45

Qt之QLocalSocket的相关文章

《Qt 实战一二三》

简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队. 但是我们还是我们,我们只是多了一份责任.古语有云:"不积跬步无以至千里,不积小流无以成江海",所以每一个伟大事务的产生都不是一蹴而就的.现在我们要立足眼下,把第一站放在地球,"<Qt 实战一二三>&quo

Qt之运行一个实例进程

简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual Studio.Qt Ctretor.QQ- 下面我们来介绍下如何实现一个实例进程. 简述 QSharedMemory QLocalServer QtSingleApplication 任务列表 更多参考 QSharedMemory 使用共享内存来实现,key值唯一,一般可以用组织名+应用名来确定.

QT中实现程序只运行一个实例--应用程序的单例化

起因 最近想实现一个应用程序单例化的程序, 目前使QT运行一个实例有如下几种方式 1.QSharedMemory 使用共享内存,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动. 2.文件锁 在程序运行的时候就在目录下创建一个文件,当程序运行时就判断这个文件是否存在,如果存在说明程序已经在运行.其本质与QSharedMemory相同 3.利用QLocalServer 参照 Qt实现应用程序单实例运行–Loca

Qt之进程间通信(TCP/IP)

简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基于TCP/IP的客户端与服务端应用程序.为实现底层的网络访问,可以使用QTcpSocket.QTcpServer和QUdpSocket,并提供底层网络类.还提供了使用常规协议实现网络操作的QNetworkRequest.QNetworkReply.QNetworkAccessManager. 简述

Qt之网络编程

简述 Qt Network模块提供的类允许编写 TCP/IP clients 和 servers. 其中包含一些低级别的类,例如:QTcpSocket.QTcpServer 和 QUdpSocket,表示低级的网络概念:一些高级别的类,例如:QNetworkRequest.QNetworkReply 和 QNetworkAccessManager,使用常见的协议执行网络操作:它还提供其他的类,例如:QNetworkConfiguration.QNetworkConfigurationManage

QT中的QInputDialog的小例子

其实这断代码没什么优秀之处,贴出来主要为为了方便自己和他人,因为以后如果用到这一块的话,这些代码可能能够直接拿过来用. InpugDialog.h头文件: #ifndef INPUGDIALOG_H #define INPUGDIALOG_H #include <QtGui> #include "ui_inpugdialog.h" class InpugDialog : public QDialog { Q_OBJECT public: InpugDialog(QWidge

vs2008-VS搭配QT,x64平台下为挖三维编的dll,怎么调试

问题描述 VS搭配QT,x64平台下为挖三维编的dll,怎么调试 VS搭配QT,x64平台下为挖三维编的dll,怎么调试?新手,试过用挖三维打开调试,但是没看到界面在哪里,请懂得QT的前辈回答,谢谢! 解决方案 https://github.com/Vaa3D/Vaa3D_Wiki/wiki/Build-Vaa3D-on-Linux

qt如何实现 滑动屏幕的效果

问题描述 qt如何实现 滑动屏幕的效果 用了qtscrollArea做了只能靠移动滑动条来实现滑动的效果,怎么样才能做到用触摸屏实现滑动效果,而不是靠滑动条.求大神指点. 解决方案 不要依赖于 qtscrollArea,自己做滑动效果,这样就可以不依靠滑动条.

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上)

[Qt教程] 第19篇 2D绘图(九)图形视图框架(上) 楼主  发表于 2013-5-4 15:26:20 | 查看: 1798| 回复: 26 图形视图框架(上) 版权声明 导语 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们.但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动,检测它们的碰撞和叠加:或者我们想让自己绘制的图形可以拖动位置,进行缩放和旋转等操作.实现这些功能,要是还使用以前的方法,那么会十分困难.解决这些问题,可以使用Qt提供的图形视图框架.