QLocalServer
继承自QObject。
QLocalServer提供了一个基于本地套接字(socket)的服务端(server)。
QLocalServer可以接受来自本地socket的连接。
server通过调用listen(),监听特定的连接。
newConnection()是在每次server与client连接上时所发出的信号。
nextPendingConnection()将等待中的连接当作一个已连接上的QLocalSocket。返回值是指向QLocalSocket的指针,这个QLocalSocket可以与client建立通信。
当发生错误时,serverError() 返回错误的类型,调用errorString()可以获取对错误的描述。
在监听过程中,通过 serverName()可以获取当前server监听的名称。
close()使QLocalServer停止对连接请求的监听。
虽然QLocalServer是为在事件循环中使用而设计出来的,但是在没有事件循环时也是可以使用的。没有事件循环时,你必须使用waitForNewConnection(),它只在以下两种情况下解除阻塞:1)有可用的连接;2)超时。
1. 建立一个QLocalServer实例 m_server
m_server->listen("servername")
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
QLocalSocket *newsocket = m_server->nextPendingConnection();
connect(newsocket, SIGNAL(readyRead()), this, SLOT(readyRead()));
// 取得是哪个localsocket可以读数据了QLocalSocket *local = static_cast<QLocalSocket *>(sender());if (!local)return;QTextStream in(local);QString readMsg;// 读出数据readMsg = in.readAll();
////////////////////////////////////////////////////////////////////////////////// server.h/////////////////////////////////////////////////////////////////////////////////#ifndef SERVER_H#define SERVER_H#include <QLocalServer>#include <QLocalSocket>class Server : public QObject{Q_OBJECTpublic:Server(){m_server = 0;}~Server(){if (m_server){delete m_server;}}int init(const QString & servername){// 如果已经有一个实例在运行了就返回0if (isServerRun(servername)) {return 0;}m_server = new QLocalServer;// 先移除原来存在的,如果不移除那么如果// servername已经存在就会listen失败QLocalServer::removeServer(servername);// 进行监听m_server->listen(servername);connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));return 1;}private slots:// 有新的连接来了void newConnection(){QLocalSocket *newsocket = m_server->nextPendingConnection();connect(newsocket, SIGNAL(readyRead()), this, SLOT(readyRead()));}// 可以读数据了void readyRead(){// 取得是哪个localsocket可以读数据了QLocalSocket *local = static_cast<QLocalSocket *>(sender());if (!local)return;QTextStream in(local);QString readMsg;// 读出数据readMsg = in.readAll();// 发送收到数据信号emit newMessage(readMsg);}private:// 判断是否有一个同名的服务器在运行int isServerRun(const QString & servername){// 用一个localsocket去连一下,如果能连上就说明// 有一个在运行了QLocalSocket ls;ls.connectToServer(servername);if (ls.waitForConnected(1000)){// 说明已经在运行了ls.disconnectFromServer();ls.close();return 1;}return 0;}signals:void newMessage(const QString &msg);private:QLocalServer *m_server;};#endif // SERVER_H////////////////////////////////////////////////////////////////////////// main.cpp///////////////////////////////////////////////////////////////////////#include <QApplication>#include <QLabel>#include <QMessageBox>#include "server.h"int main(int argc, char **argv){QApplication app(argc, argv);QLabel text("teststts");Server s;if (!s.init("localserver-test")){// 初使化失败, 说明已经有一个在运行了QMessageBox::information(&text, "info", "There is already exist one!");return 1;}QObject::connect(&s, SIGNAL(newMessage(const QString &)),&text, SLOT(setText(const QString &)));text.show();return app.exec();}
#include <QLocalSocket>#include <stdlib.h>#include <unistd.h>int main(int argc, char **argv){QLocalSocket ls;ls.connectToServer("localserver-test");srandom(1000);if (ls.waitForConnected()){while (1){QTextStream ts(&ls);ts << QString::number(random()) + "\nTTTTTTTTTT" + "\nXXXXXXXX";ts.flush();ls.waitForBytesWritten();sleep(1);}}return 0;}
本文详细介绍了QLocalServer的使用方法,包括如何创建服务器实例、监听特定连接、处理客户端连接及数据读取等步骤,并提供了完整的代码示例。

4399

被折叠的 条评论
为什么被折叠?



