Qt之QLocalSocket
简述
QLocalSocket类提供了一个本地socket。
在Windows中,这是一个命名管道;在Unix中,这是一个本地网域socket。
如果发生错误,socketError()会返回错误的类型,errorString()则返回人类可读的错误描述。
虽然QLocalSocket是一个事件循环使用而设计,它也可以不被如此使用。这种情况下,必须使用
waitForConnected()、waitForReadyRead()、waitForBytesWritten()、和waitForDisconnected()来进行阻塞,直到操作完成或超时。
成员类型文档
枚举 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的更多相关文章
- 《Qt 实战一二三》
简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...
- Qt实现应用程序单实例运行--LocalServer方式
使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...
- Qt应用程序单实例化
在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序.Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直 ...
- Qt 多线程和网络编程学习
一,Qt多线程类学习 QThread类,开始一个新的线程就是开始执行重新实现QThread::run(),run()是默认现实调用exec(),QThread::start()开始线程的执行,run( ...
- Qt之运行一个实例进程
简述 发布程序的时候,我们往往会遇到这种情况: 只需要用户运行一个实例进程 用户可以同时运行多个实例进程 一个实例进程的软件有很多,例如:360.酷狗- 多个实例进程的软件也很多,例如:Visual ...
- Qt之进程间通信(TCP/IP)
简述 可以通过Qt提供的IPC使用TCP/IP,使用QtNetwork模块即可实现,TCP/IP在实现应用程序和进程内部通信或与远程进程间的通信方面非常有用. QtNetwork模块提供的类能够创建基 ...
- Qt之文件操作 QFile
原地址:http://blog.csdn.net/liuhongwei123888/article/details/6084761 今天学习QT的文件操作 1.QIODevice直接继承自QObjec ...
- Qt 中一些常用类中文说明
Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...
- QT文件(夹)操作---QFile、QDir、QFileInfo、QTextStream和QDataStream异同
1.1 文件和目录 QFile.QBuffer和QTcpSocket可支持读写设备,用open函数打开,用write或putChar函数写入.用read和readLine或readAll进行读取 ...
随机推荐
- spark 分区
http://stackoverflow.com/questions/39368516/number-of-partitions-of-spark-dataframe
- React 设计思想
https://github.com/react-guide/react-basic React 设计思想 译者序:本文是 React 核心开发者.有 React API 终结者之称的 Sebasti ...
- angular学习笔记(三十)-指令(8)-scope
本篇讲解指令的scope属性: scope属性值可以有三种: 一.scope:false 默认值,这种情况下,指令的作用域就是指令元素当前所在的作用域. 二.scope:true 创建一个继承了父作用 ...
- http post multipart/mixed的文件.
依赖. <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>ht ...
- js 将数字转换成人民币大写的方法
//将数字转换成人民币大写的方法 var digitUppercase = function (n) { var fraction = ['角', '分']; var digit = [ '零', ' ...
- LeetCode: Jump Game II 解题报告
Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...
- Django 批量保存图片文件 自定义上传方法
1.前端通过formData的方式批量增加图片或文件 for (var i = 0; i < form_img_list.length; i++) { formData.append('imag ...
- Android开发(一)——全屏或者取消标题栏
先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 注意这句一定要写在se ...
- ubuntu 安装 sublime
1.安装包下载 http://www.sublimetext.com/ 2.解压并移动到/usr/lib/下 tar -xvf Sublime.tar.bz2 mv Sublime /usr/lib/ ...
- MyBatisBatchItemWriter Cannot change the ExecutorType when there is an existing transaction
但凡使用mybatis,同时与spring集成使用时,接下来要说的这个问题是躲不了的.众所周知,mybatis的SqlSessionFactory在获取一个SqlSession时使用默认Executo ...