带有 QList 的 C++ 多客户端 TCP 服务器
C++ Multi-Client TCP Server with QList
必要信息:
QList<QTcpSocket*> list;
QTcpServer* server;
QTcpSocket* socket;
在Qt中我建立了一个TCP-Server(QTcpServer)!我有一个 QList 和我所有连接的客户端,我想亲自读取每个客户端的传入数据。因此,如果 QTcpServer 获得新连接,我会这样处理它:
void Server::newConnection()
{
qDebug() << "New Connection";
list.append(server->nextPendingConnection());
connect(list.last(),SIGNAL(readyRead()),this,SLOT(readyRead()));
}
我怎样才能获得正确的客户端(从我的 QList 中),它发送 SIGNAL readyRead()
,我的 插槽 readyRead()
?
void Server::readyRead(){
//??
}
欢迎任何帮助!
你试过QObject::sender()了吗?它应该 return 实际发送信号的 QObject 实例。希望能有所帮助。
这可以通过 QSignalMapper
解决。这是(未完全测试的)代码:
------------------------ main.cpp----------------
#include "rootwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
RootWindow w;
w.show();
return a.exec();
}
------------------------ rootwindow.h---------------- ------
#ifndef ROOTWINDOW_H
#define ROOTWINDOW_H
#include <QMainWindow>
#include <QtDebug>
#include <QLocalServer>
#include <QLocalSocket>
#include <QSignalMapper>
#include <QList>
class RootWindow : public QMainWindow
{
Q_OBJECT
private:
QLocalServer *server;
QLocalSocket *socket;
QList<QLocalSocket*> *list;
QSignalMapper *mapper;
public:
RootWindow(QWidget *parent = 0);
~RootWindow();
private slots:
void slotNewConnection();
void slotReadyRead(int index);
};
#endif // ROOTWINDOW_H
------------------------ rootwindow.cpp---------------- --------
#include "rootwindow.h"
RootWindow::RootWindow(QWidget *parent): QMainWindow(parent)
{
server = new QLocalServer;
list = new QList<QLocalSocket*>;
mapper = new QSignalMapper(this);
connect(server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
connect(mapper, SIGNAL(mapped(int)), this, SLOT(slotReadyRead(int)));
server->listen("TestServer");
}
RootWindow::~RootWindow()
{
delete list;
}
void RootWindow::slotNewConnection()
{
qWarning() << "newConnection";
list->append(server->nextPendingConnection());
//here you map each client to its number in the list
mapper->setMapping(list->last(), list->length()-1);
//here we say, that when ever a client from the QList sends readyRead() the mapper should be used
//with the property (list->length()-1) defined in the line above
connect(list->last(), SIGNAL(readyRead()), mapper, SLOT(map()));
}
void RootWindow::slotReadyRead(int index)
{
qWarning() << "Client " << index << " has written: " << list->at(index)->readAll();
}
这基本上是您的代码,我只在相关行添加了 QSignalMapper
和一些注释。
解决方法:
void Server::readyRead(){
QByteArray buffer;
QTcpSocket* readSocket = qobject_cast<QTcpSocket*>(sender());
buffer = readSocket->readAll();
QString mytext = QString::fromStdString(buffer);
qDebug() << mytext;
}
必要信息:
QList<QTcpSocket*> list;
QTcpServer* server;
QTcpSocket* socket;
在Qt中我建立了一个TCP-Server(QTcpServer)!我有一个 QList 和我所有连接的客户端,我想亲自读取每个客户端的传入数据。因此,如果 QTcpServer 获得新连接,我会这样处理它:
void Server::newConnection()
{
qDebug() << "New Connection";
list.append(server->nextPendingConnection());
connect(list.last(),SIGNAL(readyRead()),this,SLOT(readyRead()));
}
我怎样才能获得正确的客户端(从我的 QList 中),它发送 SIGNAL readyRead()
,我的 插槽 readyRead()
?
void Server::readyRead(){
//??
}
欢迎任何帮助!
你试过QObject::sender()了吗?它应该 return 实际发送信号的 QObject 实例。希望能有所帮助。
这可以通过 QSignalMapper
解决。这是(未完全测试的)代码:
------------------------ main.cpp----------------
#include "rootwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
RootWindow w;
w.show();
return a.exec();
}
------------------------ rootwindow.h---------------- ------
#ifndef ROOTWINDOW_H
#define ROOTWINDOW_H
#include <QMainWindow>
#include <QtDebug>
#include <QLocalServer>
#include <QLocalSocket>
#include <QSignalMapper>
#include <QList>
class RootWindow : public QMainWindow
{
Q_OBJECT
private:
QLocalServer *server;
QLocalSocket *socket;
QList<QLocalSocket*> *list;
QSignalMapper *mapper;
public:
RootWindow(QWidget *parent = 0);
~RootWindow();
private slots:
void slotNewConnection();
void slotReadyRead(int index);
};
#endif // ROOTWINDOW_H
------------------------ rootwindow.cpp---------------- --------
#include "rootwindow.h"
RootWindow::RootWindow(QWidget *parent): QMainWindow(parent)
{
server = new QLocalServer;
list = new QList<QLocalSocket*>;
mapper = new QSignalMapper(this);
connect(server, SIGNAL(newConnection()), this, SLOT(slotNewConnection()));
connect(mapper, SIGNAL(mapped(int)), this, SLOT(slotReadyRead(int)));
server->listen("TestServer");
}
RootWindow::~RootWindow()
{
delete list;
}
void RootWindow::slotNewConnection()
{
qWarning() << "newConnection";
list->append(server->nextPendingConnection());
//here you map each client to its number in the list
mapper->setMapping(list->last(), list->length()-1);
//here we say, that when ever a client from the QList sends readyRead() the mapper should be used
//with the property (list->length()-1) defined in the line above
connect(list->last(), SIGNAL(readyRead()), mapper, SLOT(map()));
}
void RootWindow::slotReadyRead(int index)
{
qWarning() << "Client " << index << " has written: " << list->at(index)->readAll();
}
这基本上是您的代码,我只在相关行添加了 QSignalMapper
和一些注释。
解决方法:
void Server::readyRead(){
QByteArray buffer;
QTcpSocket* readSocket = qobject_cast<QTcpSocket*>(sender());
buffer = readSocket->readAll();
QString mytext = QString::fromStdString(buffer);
qDebug() << mytext;
}