更新代码
parent
81716767f1
commit
7b511d4816
|
@ -8,13 +8,13 @@ TcpClient::TcpClient(QTcpSocket *socket, QObject *parent) : QObject(parent)
|
||||||
ip = ip.replace("::ffff:", "");
|
ip = ip.replace("::ffff:", "");
|
||||||
port = socket->peerPort();
|
port = socket->peerPort();
|
||||||
|
|
||||||
|
connect(socket, SIGNAL(disconnected()), this, SLOT(slot_disconnected()));
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
||||||
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)),this, SLOT(disconnected()));
|
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(slot_error()));
|
||||||
#else
|
#else
|
||||||
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slot_error()));
|
||||||
#endif
|
#endif
|
||||||
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(readyRead()), this, SLOT(slot_readData()));
|
||||||
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString TcpClient::getIP() const
|
QString TcpClient::getIP() const
|
||||||
|
@ -27,14 +27,19 @@ int TcpClient::getPort() const
|
||||||
return this->port;
|
return this->port;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TcpClient::disconnected()
|
void TcpClient::slot_disconnected()
|
||||||
{
|
{
|
||||||
|
emit disconnected(ip, port);
|
||||||
socket->deleteLater();
|
socket->deleteLater();
|
||||||
this->deleteLater();
|
this->deleteLater();
|
||||||
emit clientDisconnected();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TcpClient::readData()
|
void TcpClient::slot_error()
|
||||||
|
{
|
||||||
|
emit error(ip, port, socket->errorString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void TcpClient::slot_readData()
|
||||||
{
|
{
|
||||||
QByteArray data = socket->readAll();
|
QByteArray data = socket->readAll();
|
||||||
if (data.length() <= 0) {
|
if (data.length() <= 0) {
|
||||||
|
@ -79,6 +84,11 @@ void TcpClient::sendData(const QString &data)
|
||||||
emit sendData(ip, port, data);
|
emit sendData(ip, port, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TcpClient::disconnectFromHost()
|
||||||
|
{
|
||||||
|
socket->disconnectFromHost();
|
||||||
|
}
|
||||||
|
|
||||||
void TcpClient::abort()
|
void TcpClient::abort()
|
||||||
{
|
{
|
||||||
socket->abort();
|
socket->abort();
|
||||||
|
|
|
@ -26,16 +26,20 @@ public:
|
||||||
int getPort() const;
|
int getPort() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void disconnected();
|
void slot_disconnected();
|
||||||
void readData();
|
void slot_error();
|
||||||
|
void slot_readData();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void clientDisconnected();
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sendData(const QString &data);
|
void sendData(const QString &data);
|
||||||
|
void disconnectFromHost();
|
||||||
void abort();
|
void abort();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -3,34 +3,27 @@
|
||||||
|
|
||||||
TcpServer::TcpServer(QObject *parent) : QTcpServer(parent)
|
TcpServer::TcpServer(QObject *parent) : QTcpServer(parent)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(newConnection()), this, SLOT(newConnection()));
|
connect(this, SIGNAL(newConnection()), this, SLOT(slot_newConnection()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TcpServer::newConnection()
|
void TcpServer::slot_newConnection()
|
||||||
{
|
{
|
||||||
QTcpSocket *socket = this->nextPendingConnection();
|
QTcpSocket *socket = this->nextPendingConnection();
|
||||||
TcpClient *client = new TcpClient(socket, this);
|
TcpClient *client = new TcpClient(socket, this);
|
||||||
connect(client, SIGNAL(clientDisconnected()), this, SLOT(disconnected()));
|
connect(client, SIGNAL(disconnected(QString, int)), this, SLOT(slot_disconnected(QString, int)));
|
||||||
|
connect(client, SIGNAL(error(QString, int, QString)), this, SIGNAL(error(QString, int, QString)));
|
||||||
connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
|
connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
|
||||||
connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));
|
connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));
|
||||||
|
|
||||||
QString ip = client->getIP();
|
emit connected(client->getIP(), client->getPort());
|
||||||
int port = client->getPort();
|
|
||||||
emit clientConnected(ip, port);
|
|
||||||
emit sendData(ip, port, "客户端上线");
|
|
||||||
|
|
||||||
//连接后加入链表
|
//连接后加入链表
|
||||||
clients.append(client);
|
clients.append(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TcpServer::disconnected()
|
void TcpServer::slot_disconnected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
TcpClient *client = (TcpClient *)sender();
|
TcpClient *client = (TcpClient *)sender();
|
||||||
QString ip = client->getIP();
|
emit disconnected(ip, port);
|
||||||
int port = client->getPort();
|
|
||||||
emit clientDisconnected(ip, port);
|
|
||||||
emit sendData(ip, port, "客户端下线");
|
|
||||||
|
|
||||||
//断开连接后从链表中移除
|
//断开连接后从链表中移除
|
||||||
clients.removeOne(client);
|
clients.removeOne(client);
|
||||||
}
|
}
|
||||||
|
@ -44,7 +37,6 @@ bool TcpServer::start()
|
||||||
void TcpServer::stop()
|
void TcpServer::stop()
|
||||||
{
|
{
|
||||||
remove();
|
remove();
|
||||||
this->disconnected();
|
|
||||||
this->close();
|
this->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,16 +13,17 @@ private:
|
||||||
QList<TcpClient *> clients;
|
QList<TcpClient *> clients;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void newConnection();
|
void slot_newConnection();
|
||||||
void disconnected();
|
void slot_disconnected(const QString &ip, int port);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void connected(const QString &ip, int port);
|
||||||
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
void clientConnected(const QString &ip, int port);
|
|
||||||
void clientDisconnected(const QString &ip, int port);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
//启动服务
|
//启动服务
|
||||||
bool start();
|
bool start();
|
||||||
|
|
|
@ -8,10 +8,10 @@ WebClient::WebClient(QWebSocket *socket, QObject *parent) : QObject(parent)
|
||||||
ip = ip.replace("::ffff:", "");
|
ip = ip.replace("::ffff:", "");
|
||||||
port = socket->peerPort();
|
port = socket->peerPort();
|
||||||
|
|
||||||
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(disconnected()), this, SLOT(slot_disconnected()));
|
||||||
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slot_error()));
|
||||||
|
|
||||||
//暂时使用前面两个信号,部分系统上后面两个信号Qt没实现,目前测试到5.15.2
|
//暂时使用前面两个信号,部分系统后面两个信号Qt没实现,目前测试到5.15.2
|
||||||
//在win上如果两组信号都关联了则都会触发,另外一组信号就是多个参数表示是否是最后一个数据包
|
//在win上如果两组信号都关联了则都会触发,另外一组信号就是多个参数表示是否是最后一个数据包
|
||||||
connect(socket, SIGNAL(textMessageReceived(QString)), this, SLOT(textMessageReceived(QString)));
|
connect(socket, SIGNAL(textMessageReceived(QString)), this, SLOT(textMessageReceived(QString)));
|
||||||
connect(socket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(binaryMessageReceived(QByteArray)));
|
connect(socket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(binaryMessageReceived(QByteArray)));
|
||||||
|
@ -29,11 +29,16 @@ int WebClient::getPort() const
|
||||||
return this->port;
|
return this->port;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebClient::disconnected()
|
void WebClient::slot_disconnected()
|
||||||
{
|
{
|
||||||
|
emit disconnected(ip, port);
|
||||||
socket->deleteLater();
|
socket->deleteLater();
|
||||||
this->deleteLater();
|
this->deleteLater();
|
||||||
emit clientDisconnected();
|
}
|
||||||
|
|
||||||
|
void WebClient::slot_error()
|
||||||
|
{
|
||||||
|
emit error(ip, port, socket->errorString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebClient::textFrameReceived(const QString &data, bool isLastFrame)
|
void WebClient::textFrameReceived(const QString &data, bool isLastFrame)
|
||||||
|
|
|
@ -26,14 +26,18 @@ public:
|
||||||
int getPort() const;
|
int getPort() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void disconnected();
|
void slot_disconnected();
|
||||||
|
void slot_error();
|
||||||
|
|
||||||
void textFrameReceived(const QString &data, bool isLastFrame);
|
void textFrameReceived(const QString &data, bool isLastFrame);
|
||||||
void binaryFrameReceived(const QByteArray &data, bool isLastFrame);
|
void binaryFrameReceived(const QByteArray &data, bool isLastFrame);
|
||||||
void textMessageReceived(const QString &data);
|
void textMessageReceived(const QString &data);
|
||||||
void binaryMessageReceived(const QByteArray &data);
|
void binaryMessageReceived(const QByteArray &data);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void clientDisconnected();
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
|
|
|
@ -3,34 +3,27 @@
|
||||||
|
|
||||||
WebServer::WebServer(const QString &serverName, SslMode secureMode, QObject *parent) : QWebSocketServer(serverName, secureMode, parent)
|
WebServer::WebServer(const QString &serverName, SslMode secureMode, QObject *parent) : QWebSocketServer(serverName, secureMode, parent)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(newConnection()), this, SLOT(newConnection()));
|
connect(this, SIGNAL(newConnection()), this, SLOT(slot_newConnection()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServer::newConnection()
|
void WebServer::slot_newConnection()
|
||||||
{
|
{
|
||||||
QWebSocket *socket = this->nextPendingConnection();
|
QWebSocket *socket = this->nextPendingConnection();
|
||||||
WebClient *client = new WebClient(socket, this);
|
WebClient *client = new WebClient(socket, this);
|
||||||
connect(client, SIGNAL(clientDisconnected()), this, SLOT(disconnected()));
|
connect(client, SIGNAL(disconnected(QString, int)), this, SLOT(slot_disconnected(QString, int)));
|
||||||
|
connect(client, SIGNAL(error(QString, int, QString)), this, SIGNAL(error(QString, int, QString)));
|
||||||
connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
|
connect(client, SIGNAL(sendData(QString, int, QString)), this, SIGNAL(sendData(QString, int, QString)));
|
||||||
connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));
|
connect(client, SIGNAL(receiveData(QString, int, QString)), this, SIGNAL(receiveData(QString, int, QString)));
|
||||||
|
|
||||||
QString ip = client->getIP();
|
emit connected(client->getIP(), client->getPort());
|
||||||
int port = client->getPort();
|
|
||||||
emit clientConnected(ip, port);
|
|
||||||
emit sendData(ip, port, "客户端上线");
|
|
||||||
|
|
||||||
//连接后加入链表
|
//连接后加入链表
|
||||||
clients.append(client);
|
clients.append(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebServer::disconnected()
|
void WebServer::slot_disconnected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
WebClient *client = (WebClient *)sender();
|
WebClient *client = (WebClient *)sender();
|
||||||
QString ip = client->getIP();
|
emit disconnected(ip, port);
|
||||||
int port = client->getPort();
|
|
||||||
emit clientDisconnected(ip, port);
|
|
||||||
emit sendData(ip, port, "客户端下线");
|
|
||||||
|
|
||||||
//断开连接后从链表中移除
|
//断开连接后从链表中移除
|
||||||
clients.removeOne(client);
|
clients.removeOne(client);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,16 +13,17 @@ private:
|
||||||
QList<WebClient *> clients;
|
QList<WebClient *> clients;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void newConnection();
|
void slot_newConnection();
|
||||||
void disconnected();
|
void slot_disconnected(const QString &ip, int port);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void connected(const QString &ip, int port);
|
||||||
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
void clientConnected(const QString &ip, int port);
|
|
||||||
void clientDisconnected(const QString &ip, int port);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
//启动服务
|
//启动服务
|
||||||
bool start();
|
bool start();
|
||||||
|
|
|
@ -14,19 +14,36 @@ frmTcpClient::~frmTcpClient()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmTcpClient::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmTcpClient::initForm()
|
void frmTcpClient::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
isOk = false;
|
isOk = false;
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
socket = new QTcpSocket(this);
|
socket = new QTcpSocket(this);
|
||||||
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
|
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
|
||||||
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(disconnected()));
|
|
||||||
#else
|
|
||||||
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disconnected()));
|
|
||||||
#endif
|
|
||||||
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
||||||
|
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#else
|
||||||
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#endif
|
||||||
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
||||||
|
|
||||||
//定时器发送数据
|
//定时器发送数据
|
||||||
|
@ -146,10 +163,10 @@ void frmTcpClient::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -162,20 +179,20 @@ void frmTcpClient::connected()
|
||||||
isOk = true;
|
isOk = true;
|
||||||
ui->btnConnect->setText("断开");
|
ui->btnConnect->setText("断开");
|
||||||
append(0, "服务器连接");
|
append(0, "服务器连接");
|
||||||
append(2, QString("本地地址: %1 本地端口: %2").arg(socket->localAddress().toString()).arg(socket->localPort()));
|
append(0, QString("本地地址: %1 本地端口: %2").arg(socket->localAddress().toString()).arg(socket->localPort()));
|
||||||
append(2, QString("远程地址: %1 远程端口: %2").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
|
append(0, QString("远程地址: %1 远程端口: %2").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpClient::disconnected()
|
void frmTcpClient::disconnected()
|
||||||
{
|
{
|
||||||
isOk = false;
|
isOk = false;
|
||||||
//socket->abort();
|
|
||||||
ui->btnConnect->setText("连接");
|
ui->btnConnect->setText("连接");
|
||||||
append(1, "服务器断开");
|
append(1, "服务器断开");
|
||||||
//打印下可能的错误信息
|
}
|
||||||
if (socket->error() != QTcpSocket::UnknownSocketError) {
|
|
||||||
append(2, socket->errorString());
|
void frmTcpClient::error()
|
||||||
}
|
{
|
||||||
|
append(2, socket->errorString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpClient::readData()
|
void frmTcpClient::readData()
|
||||||
|
@ -227,9 +244,10 @@ void frmTcpClient::on_btnConnect_clicked()
|
||||||
{
|
{
|
||||||
if (ui->btnConnect->text() == "连接") {
|
if (ui->btnConnect->text() == "连接") {
|
||||||
//断开所有连接和操作
|
//断开所有连接和操作
|
||||||
socket->abort();
|
//socket->abort();
|
||||||
//绑定网卡和端口
|
//绑定网卡和端口
|
||||||
//有个后遗症,关闭连接或者关闭程序后还会保持几分钟导致不能重复绑定
|
//有个后遗症,客户端这边断开连接后还会保持几分钟导致不能重复绑定
|
||||||
|
//如果是服务器断开则可以继续使用
|
||||||
//提示 The bound address is already in use
|
//提示 The bound address is already in use
|
||||||
//参考 https://www.cnblogs.com/baiduboy/p/7426822.html
|
//参考 https://www.cnblogs.com/baiduboy/p/7426822.html
|
||||||
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
|
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmTcpClient(QWidget *parent = 0);
|
explicit frmTcpClient(QWidget *parent = 0);
|
||||||
~frmTcpClient();
|
~frmTcpClient();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmTcpClient *ui;
|
Ui::frmTcpClient *ui;
|
||||||
|
|
||||||
|
@ -33,6 +36,7 @@ private slots:
|
||||||
private slots:
|
private slots:
|
||||||
void connected();
|
void connected();
|
||||||
void disconnected();
|
void disconnected();
|
||||||
|
void error();
|
||||||
void readData();
|
void readData();
|
||||||
void sendData(const QString &data);
|
void sendData(const QString &data);
|
||||||
|
|
||||||
|
|
|
@ -12,17 +12,37 @@ frmTcpServer::frmTcpServer(QWidget *parent) : QWidget(parent), ui(new Ui::frmTcp
|
||||||
|
|
||||||
frmTcpServer::~frmTcpServer()
|
frmTcpServer::~frmTcpServer()
|
||||||
{
|
{
|
||||||
|
//结束的时候停止服务
|
||||||
|
server->stop();
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmTcpServer::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmTcpServer::initForm()
|
void frmTcpServer::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
isOk = false;
|
isOk = false;
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
server = new TcpServer(this);
|
server = new TcpServer(this);
|
||||||
connect(server, SIGNAL(clientConnected(QString, int)), this, SLOT(clientConnected(QString, int)));
|
connect(server, SIGNAL(connected(QString, int)), this, SLOT(connected(QString, int)));
|
||||||
connect(server, SIGNAL(clientDisconnected(QString, int)), this, SLOT(clientDisconnected(QString, int)));
|
connect(server, SIGNAL(disconnected(QString, int)), this, SLOT(disconnected(QString, int)));
|
||||||
|
connect(server, SIGNAL(error(QString, int, QString)), this, SLOT(error(QString, int, QString)));
|
||||||
connect(server, SIGNAL(sendData(QString, int, QString)), this, SLOT(sendData(QString, int, QString)));
|
connect(server, SIGNAL(sendData(QString, int, QString)), this, SLOT(sendData(QString, int, QString)));
|
||||||
connect(server, SIGNAL(receiveData(QString, int, QString)), this, SLOT(receiveData(QString, int, QString)));
|
connect(server, SIGNAL(receiveData(QString, int, QString)), this, SLOT(receiveData(QString, int, QString)));
|
||||||
|
|
||||||
|
@ -133,10 +153,10 @@ void frmTcpServer::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -144,15 +164,19 @@ void frmTcpServer::append(int type, const QString &data, bool clear)
|
||||||
currentCount++;
|
currentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpServer::clientConnected(const QString &ip, int port)
|
void frmTcpServer::connected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
|
append(0, QString("[%1:%2] %3").arg(ip).arg(port).arg("客户端上线"));
|
||||||
|
|
||||||
QString str = QString("%1:%2").arg(ip).arg(port);
|
QString str = QString("%1:%2").arg(ip).arg(port);
|
||||||
ui->listWidget->addItem(str);
|
ui->listWidget->addItem(str);
|
||||||
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpServer::clientDisconnected(const QString &ip, int port)
|
void frmTcpServer::disconnected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
|
append(2, QString("[%1:%2] %3").arg(ip).arg(port).arg("客户端下线"));
|
||||||
|
|
||||||
int row = -1;
|
int row = -1;
|
||||||
QString str = QString("%1:%2").arg(ip).arg(port);
|
QString str = QString("%1:%2").arg(ip).arg(port);
|
||||||
for (int i = 0; i < ui->listWidget->count(); i++) {
|
for (int i = 0; i < ui->listWidget->count(); i++) {
|
||||||
|
@ -166,17 +190,19 @@ void frmTcpServer::clientDisconnected(const QString &ip, int port)
|
||||||
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void frmTcpServer::error(const QString &ip, int port, const QString &error)
|
||||||
|
{
|
||||||
|
append(2, QString("[%1:%2] %3").arg(ip).arg(port).arg(error));
|
||||||
|
}
|
||||||
|
|
||||||
void frmTcpServer::sendData(const QString &ip, int port, const QString &data)
|
void frmTcpServer::sendData(const QString &ip, int port, const QString &data)
|
||||||
{
|
{
|
||||||
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(data);
|
append(0, QString("[%1:%2] %3").arg(ip).arg(port).arg(data));
|
||||||
bool error = (data.contains("下线") || data.contains("离线"));
|
|
||||||
append(error ? 1 : 0, str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpServer::receiveData(const QString &ip, int port, const QString &data)
|
void frmTcpServer::receiveData(const QString &ip, int port, const QString &data)
|
||||||
{
|
{
|
||||||
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(data);
|
append(1, QString("[%1:%2] %3").arg(ip).arg(port).arg(data));
|
||||||
append(1, str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpServer::on_btnListen_clicked()
|
void frmTcpServer::on_btnListen_clicked()
|
||||||
|
@ -229,7 +255,7 @@ void frmTcpServer::on_btnSend_clicked()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmTcpServer::on_btnClose_clicked()
|
void frmTcpServer::on_btnRemove_clicked()
|
||||||
{
|
{
|
||||||
if (ui->ckSelectAll->isChecked()) {
|
if (ui->ckSelectAll->isChecked()) {
|
||||||
server->remove();
|
server->remove();
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmTcpServer(QWidget *parent = 0);
|
explicit frmTcpServer(QWidget *parent = 0);
|
||||||
~frmTcpServer();
|
~frmTcpServer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmTcpServer *ui;
|
Ui::frmTcpServer *ui;
|
||||||
|
|
||||||
|
@ -31,8 +34,10 @@ private slots:
|
||||||
void append(int type, const QString &data, bool clear = false);
|
void append(int type, const QString &data, bool clear = false);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void clientConnected(const QString &ip, int port);
|
void connected(const QString &ip, int port);
|
||||||
void clientDisconnected(const QString &ip, int port);
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
|
@ -41,7 +46,7 @@ private slots:
|
||||||
void on_btnSave_clicked();
|
void on_btnSave_clicked();
|
||||||
void on_btnClear_clicked();
|
void on_btnClear_clicked();
|
||||||
void on_btnSend_clicked();
|
void on_btnSend_clicked();
|
||||||
void on_btnClose_clicked();
|
void on_btnRemove_clicked();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FRMTCPSERVER_H
|
#endif // FRMTCPSERVER_H
|
||||||
|
|
|
@ -153,9 +153,9 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="btnClose">
|
<widget class="QPushButton" name="btnRemove">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>断开</string>
|
<string>移除</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -262,7 +262,7 @@
|
||||||
<tabstop>btnListen</tabstop>
|
<tabstop>btnListen</tabstop>
|
||||||
<tabstop>btnSave</tabstop>
|
<tabstop>btnSave</tabstop>
|
||||||
<tabstop>btnClear</tabstop>
|
<tabstop>btnClear</tabstop>
|
||||||
<tabstop>btnClose</tabstop>
|
<tabstop>btnRemove</tabstop>
|
||||||
<tabstop>listWidget</tabstop>
|
<tabstop>listWidget</tabstop>
|
||||||
<tabstop>ckSelectAll</tabstop>
|
<tabstop>ckSelectAll</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
|
|
|
@ -14,10 +14,32 @@ frmUdpClient::~frmUdpClient()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmUdpClient::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmUdpClient::initForm()
|
void frmUdpClient::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
socket = new QUdpSocket(this);
|
socket = new QUdpSocket(this);
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
||||||
|
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#else
|
||||||
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#endif
|
||||||
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
||||||
|
|
||||||
//定时器发送数据
|
//定时器发送数据
|
||||||
|
@ -131,10 +153,10 @@ void frmUdpClient::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -142,6 +164,11 @@ void frmUdpClient::append(int type, const QString &data, bool clear)
|
||||||
currentCount++;
|
currentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void frmUdpClient::error()
|
||||||
|
{
|
||||||
|
append(2, socket->errorString());
|
||||||
|
}
|
||||||
|
|
||||||
void frmUdpClient::readData()
|
void frmUdpClient::readData()
|
||||||
{
|
{
|
||||||
QHostAddress host;
|
QHostAddress host;
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmUdpClient(QWidget *parent = 0);
|
explicit frmUdpClient(QWidget *parent = 0);
|
||||||
~frmUdpClient();
|
~frmUdpClient();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmUdpClient *ui;
|
Ui::frmUdpClient *ui;
|
||||||
|
|
||||||
|
@ -30,6 +33,7 @@ private slots:
|
||||||
void append(int type, const QString &data, bool clear = false);
|
void append(int type, const QString &data, bool clear = false);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void error();
|
||||||
void readData();
|
void readData();
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,32 @@ frmUdpServer::~frmUdpServer()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmUdpServer::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmUdpServer::initForm()
|
void frmUdpServer::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
socket = new QUdpSocket(this);
|
socket = new QUdpSocket(this);
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
|
||||||
|
connect(socket, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#else
|
||||||
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
#endif
|
||||||
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
|
||||||
|
|
||||||
//定时器发送数据
|
//定时器发送数据
|
||||||
|
@ -128,10 +150,10 @@ void frmUdpServer::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -139,6 +161,11 @@ void frmUdpServer::append(int type, const QString &data, bool clear)
|
||||||
currentCount++;
|
currentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void frmUdpServer::error()
|
||||||
|
{
|
||||||
|
append(2, socket->errorString());
|
||||||
|
}
|
||||||
|
|
||||||
void frmUdpServer::readData()
|
void frmUdpServer::readData()
|
||||||
{
|
{
|
||||||
QHostAddress host;
|
QHostAddress host;
|
||||||
|
@ -166,7 +193,19 @@ void frmUdpServer::readData()
|
||||||
|
|
||||||
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(buffer);
|
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(buffer);
|
||||||
append(1, str);
|
append(1, str);
|
||||||
clientConnected(ip, port);
|
|
||||||
|
//先过滤重复的
|
||||||
|
str = QString("%1:%2").arg(ip).arg(port);
|
||||||
|
for (int i = 0; i < ui->listWidget->count(); i++) {
|
||||||
|
QString s = ui->listWidget->item(i)->text();
|
||||||
|
if (str == s) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//添加到列表
|
||||||
|
ui->listWidget->addItem(str);
|
||||||
|
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
||||||
|
|
||||||
if (AppConfig::DebugUdpServer) {
|
if (AppConfig::DebugUdpServer) {
|
||||||
int count = AppData::Keys.count();
|
int count = AppData::Keys.count();
|
||||||
|
@ -197,21 +236,6 @@ void frmUdpServer::sendData(const QString &ip, int port, const QString &data)
|
||||||
append(0, str);
|
append(0, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmUdpServer::clientConnected(const QString &ip, int port)
|
|
||||||
{
|
|
||||||
//先过滤重复的
|
|
||||||
QString str = QString("%1:%2").arg(ip).arg(port);
|
|
||||||
for (int i = 0; i < ui->listWidget->count(); i++) {
|
|
||||||
QString s = ui->listWidget->item(i)->text();
|
|
||||||
if (str == s) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->listWidget->addItem(str);
|
|
||||||
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void frmUdpServer::on_btnListen_clicked()
|
void frmUdpServer::on_btnListen_clicked()
|
||||||
{
|
{
|
||||||
if (ui->btnListen->text() == "监听") {
|
if (ui->btnListen->text() == "监听") {
|
||||||
|
@ -260,3 +284,15 @@ void frmUdpServer::on_btnSend_clicked()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void frmUdpServer::on_btnRemove_clicked()
|
||||||
|
{
|
||||||
|
if (ui->ckSelectAll->isChecked()) {
|
||||||
|
ui->listWidget->clear();
|
||||||
|
} else {
|
||||||
|
int row = ui->listWidget->currentRow();
|
||||||
|
if (row >= 0) {
|
||||||
|
delete ui->listWidget->takeItem(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmUdpServer(QWidget *parent = 0);
|
explicit frmUdpServer(QWidget *parent = 0);
|
||||||
~frmUdpServer();
|
~frmUdpServer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmUdpServer *ui;
|
Ui::frmUdpServer *ui;
|
||||||
|
|
||||||
|
@ -30,15 +33,16 @@ private slots:
|
||||||
void append(int type, const QString &data, bool clear = false);
|
void append(int type, const QString &data, bool clear = false);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void error();
|
||||||
void readData();
|
void readData();
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void clientConnected(const QString &ip, int port);
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void on_btnListen_clicked();
|
void on_btnListen_clicked();
|
||||||
void on_btnSave_clicked();
|
void on_btnSave_clicked();
|
||||||
void on_btnClear_clicked();
|
void on_btnClear_clicked();
|
||||||
void on_btnSend_clicked();
|
void on_btnSend_clicked();
|
||||||
|
void on_btnRemove_clicked();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FRMUDPSERVER_H
|
#endif // FRMUDPSERVER_H
|
||||||
|
|
|
@ -152,6 +152,13 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="btnRemove">
|
||||||
|
<property name="text">
|
||||||
|
<string>移除</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="labCount">
|
<widget class="QLabel" name="labCount">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
|
|
|
@ -14,15 +14,32 @@ frmWebClient::~frmWebClient()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmWebClient::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmWebClient::initForm()
|
void frmWebClient::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
isOk = false;
|
isOk = false;
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
socket = new QWebSocket("WebSocket", QWebSocketProtocol::VersionLatest, this);
|
socket = new QWebSocket("WebSocket", QWebSocketProtocol::VersionLatest, this);
|
||||||
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
|
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
|
||||||
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(disconnected()));
|
|
||||||
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
|
||||||
|
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
|
||||||
|
|
||||||
//暂时使用前面两个信号,部分系统上后面两个信号Qt没实现,目前测试到5.15.2
|
//暂时使用前面两个信号,部分系统上后面两个信号Qt没实现,目前测试到5.15.2
|
||||||
//在win上如果两组信号都关联了则都会触发,另外一组信号就是多个参数表示是否是最后一个数据包
|
//在win上如果两组信号都关联了则都会触发,另外一组信号就是多个参数表示是否是最后一个数据包
|
||||||
|
@ -133,10 +150,10 @@ void frmWebClient::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -149,20 +166,20 @@ void frmWebClient::connected()
|
||||||
isOk = true;
|
isOk = true;
|
||||||
ui->btnConnect->setText("断开");
|
ui->btnConnect->setText("断开");
|
||||||
append(0, "服务器连接");
|
append(0, "服务器连接");
|
||||||
append(2, QString("本地地址: %1 本地端口: %2").arg(socket->localAddress().toString()).arg(socket->localPort()));
|
append(0, QString("本地地址: %1 本地端口: %2").arg(socket->localAddress().toString()).arg(socket->localPort()));
|
||||||
append(2, QString("远程地址: %1 远程端口: %2").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
|
append(0, QString("远程地址: %1 远程端口: %2").arg(socket->peerAddress().toString()).arg(socket->peerPort()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebClient::disconnected()
|
void frmWebClient::disconnected()
|
||||||
{
|
{
|
||||||
isOk = false;
|
isOk = false;
|
||||||
//socket->abort();
|
|
||||||
ui->btnConnect->setText("连接");
|
ui->btnConnect->setText("连接");
|
||||||
append(1, "服务器断开");
|
append(1, "服务器断开");
|
||||||
//打印下可能的错误信息
|
}
|
||||||
if (socket->error() != QTcpSocket::UnknownSocketError) {
|
|
||||||
append(2, socket->errorString());
|
void frmWebClient::error()
|
||||||
}
|
{
|
||||||
|
append(2, socket->errorString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebClient::sendData(const QString &data)
|
void frmWebClient::sendData(const QString &data)
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmWebClient(QWidget *parent = 0);
|
explicit frmWebClient(QWidget *parent = 0);
|
||||||
~frmWebClient();
|
~frmWebClient();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmWebClient *ui;
|
Ui::frmWebClient *ui;
|
||||||
|
|
||||||
|
@ -33,6 +36,7 @@ private slots:
|
||||||
private slots:
|
private slots:
|
||||||
void connected();
|
void connected();
|
||||||
void disconnected();
|
void disconnected();
|
||||||
|
void error();
|
||||||
void sendData(const QString &data);
|
void sendData(const QString &data);
|
||||||
|
|
||||||
void textFrameReceived(const QString &data, bool isLastFrame);
|
void textFrameReceived(const QString &data, bool isLastFrame);
|
||||||
|
|
|
@ -15,14 +15,32 @@ frmWebServer::~frmWebServer()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool frmWebServer::eventFilter(QObject *watched, QEvent *event)
|
||||||
|
{
|
||||||
|
//双击清空
|
||||||
|
if (watched == ui->txtMain->viewport()) {
|
||||||
|
if (event->type() == QEvent::MouseButtonDblClick) {
|
||||||
|
on_btnClear_clicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(watched, event);
|
||||||
|
}
|
||||||
|
|
||||||
void frmWebServer::initForm()
|
void frmWebServer::initForm()
|
||||||
{
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setPixelSize(16);
|
||||||
|
ui->txtMain->setFont(font);
|
||||||
|
ui->txtMain->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
isOk = false;
|
isOk = false;
|
||||||
|
|
||||||
//实例化对象并绑定信号槽
|
//实例化对象并绑定信号槽
|
||||||
server = new WebServer("WebServer", QWebSocketServer::NonSecureMode, this);
|
server = new WebServer("WebServer", QWebSocketServer::NonSecureMode, this);
|
||||||
connect(server, SIGNAL(clientConnected(QString, int)), this, SLOT(clientConnected(QString, int)));
|
connect(server, SIGNAL(connected(QString, int)), this, SLOT(connected(QString, int)));
|
||||||
connect(server, SIGNAL(clientDisconnected(QString, int)), this, SLOT(clientDisconnected(QString, int)));
|
connect(server, SIGNAL(disconnected(QString, int)), this, SLOT(disconnected(QString, int)));
|
||||||
|
connect(server, SIGNAL(error(QString, int, QString)), this, SLOT(error(QString, int, QString)));
|
||||||
connect(server, SIGNAL(sendData(QString, int, QString)), this, SLOT(sendData(QString, int, QString)));
|
connect(server, SIGNAL(sendData(QString, int, QString)), this, SLOT(sendData(QString, int, QString)));
|
||||||
connect(server, SIGNAL(receiveData(QString, int, QString)), this, SLOT(receiveData(QString, int, QString)));
|
connect(server, SIGNAL(receiveData(QString, int, QString)), this, SLOT(receiveData(QString, int, QString)));
|
||||||
|
|
||||||
|
@ -133,10 +151,10 @@ void frmWebServer::append(int type, const QString &data, bool clear)
|
||||||
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
ui->txtMain->setTextColor(QColor("#22A3A9"));
|
||||||
} else if (type == 1) {
|
} else if (type == 1) {
|
||||||
strType = "接收";
|
strType = "接收";
|
||||||
ui->txtMain->setTextColor(QColor("#D64D54"));
|
ui->txtMain->setTextColor(QColor("#753775"));
|
||||||
} else {
|
} else {
|
||||||
strType = "信息";
|
strType = "错误";
|
||||||
ui->txtMain->setTextColor(QColor("#A279C5"));
|
ui->txtMain->setTextColor(QColor("#D64D54"));
|
||||||
}
|
}
|
||||||
|
|
||||||
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
strData = QString("时间[%1] %2: %3").arg(TIMEMS).arg(strType).arg(strData);
|
||||||
|
@ -144,15 +162,19 @@ void frmWebServer::append(int type, const QString &data, bool clear)
|
||||||
currentCount++;
|
currentCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebServer::clientConnected(const QString &ip, int port)
|
void frmWebServer::connected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
|
append(0, QString("[%1:%2] %3").arg(ip).arg(port).arg("客户端上线"));
|
||||||
|
|
||||||
QString str = QString("%1:%2").arg(ip).arg(port);
|
QString str = QString("%1:%2").arg(ip).arg(port);
|
||||||
ui->listWidget->addItem(str);
|
ui->listWidget->addItem(str);
|
||||||
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebServer::clientDisconnected(const QString &ip, int port)
|
void frmWebServer::disconnected(const QString &ip, int port)
|
||||||
{
|
{
|
||||||
|
append(2, QString("[%1:%2] %3").arg(ip).arg(port).arg("客户端下线"));
|
||||||
|
|
||||||
int row = -1;
|
int row = -1;
|
||||||
QString str = QString("%1:%2").arg(ip).arg(port);
|
QString str = QString("%1:%2").arg(ip).arg(port);
|
||||||
for (int i = 0; i < ui->listWidget->count(); i++) {
|
for (int i = 0; i < ui->listWidget->count(); i++) {
|
||||||
|
@ -166,17 +188,19 @@ void frmWebServer::clientDisconnected(const QString &ip, int port)
|
||||||
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
ui->labCount->setText(QString("共 %1 个客户端").arg(ui->listWidget->count()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void frmWebServer::error(const QString &ip, int port, const QString &error)
|
||||||
|
{
|
||||||
|
append(2, QString("[%1:%2] %3").arg(ip).arg(port).arg(error));
|
||||||
|
}
|
||||||
|
|
||||||
void frmWebServer::sendData(const QString &ip, int port, const QString &data)
|
void frmWebServer::sendData(const QString &ip, int port, const QString &data)
|
||||||
{
|
{
|
||||||
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(data);
|
append(0, QString("[%1:%2] %3").arg(ip).arg(port).arg(data));
|
||||||
bool error = (data.contains("下线") || data.contains("离线"));
|
|
||||||
append(error ? 1 : 0, str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebServer::receiveData(const QString &ip, int port, const QString &data)
|
void frmWebServer::receiveData(const QString &ip, int port, const QString &data)
|
||||||
{
|
{
|
||||||
QString str = QString("[%1:%2] %3").arg(ip).arg(port).arg(data);
|
append(1, QString("[%1:%2] %3").arg(ip).arg(port).arg(data));
|
||||||
append(1, str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebServer::on_btnListen_clicked()
|
void frmWebServer::on_btnListen_clicked()
|
||||||
|
@ -229,7 +253,7 @@ void frmWebServer::on_btnSend_clicked()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void frmWebServer::on_btnClose_clicked()
|
void frmWebServer::on_btnRemove_clicked()
|
||||||
{
|
{
|
||||||
if (ui->ckSelectAll->isChecked()) {
|
if (ui->ckSelectAll->isChecked()) {
|
||||||
server->remove();
|
server->remove();
|
||||||
|
|
|
@ -16,6 +16,9 @@ public:
|
||||||
explicit frmWebServer(QWidget *parent = 0);
|
explicit frmWebServer(QWidget *parent = 0);
|
||||||
~frmWebServer();
|
~frmWebServer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool eventFilter(QObject *watched, QEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::frmWebServer *ui;
|
Ui::frmWebServer *ui;
|
||||||
|
|
||||||
|
@ -31,8 +34,10 @@ private slots:
|
||||||
void append(int type, const QString &data, bool clear = false);
|
void append(int type, const QString &data, bool clear = false);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void clientConnected(const QString &ip, int port);
|
void connected(const QString &ip, int port);
|
||||||
void clientDisconnected(const QString &ip, int port);
|
void disconnected(const QString &ip, int port);
|
||||||
|
void error(const QString &ip, int port, const QString &error);
|
||||||
|
|
||||||
void sendData(const QString &ip, int port, const QString &data);
|
void sendData(const QString &ip, int port, const QString &data);
|
||||||
void receiveData(const QString &ip, int port, const QString &data);
|
void receiveData(const QString &ip, int port, const QString &data);
|
||||||
|
|
||||||
|
@ -41,7 +46,7 @@ private slots:
|
||||||
void on_btnSave_clicked();
|
void on_btnSave_clicked();
|
||||||
void on_btnClear_clicked();
|
void on_btnClear_clicked();
|
||||||
void on_btnSend_clicked();
|
void on_btnSend_clicked();
|
||||||
void on_btnClose_clicked();
|
void on_btnRemove_clicked();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FRMWEBSERVER_H
|
#endif // FRMWEBSERVER_H
|
||||||
|
|
|
@ -153,9 +153,9 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="btnClose">
|
<widget class="QPushButton" name="btnRemove">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>断开</string>
|
<string>移除</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -262,7 +262,7 @@
|
||||||
<tabstop>btnListen</tabstop>
|
<tabstop>btnListen</tabstop>
|
||||||
<tabstop>btnSave</tabstop>
|
<tabstop>btnSave</tabstop>
|
||||||
<tabstop>btnClear</tabstop>
|
<tabstop>btnClear</tabstop>
|
||||||
<tabstop>btnClose</tabstop>
|
<tabstop>btnRemove</tabstop>
|
||||||
<tabstop>listWidget</tabstop>
|
<tabstop>listWidget</tabstop>
|
||||||
<tabstop>ckSelectAll</tabstop>
|
<tabstop>ckSelectAll</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
|
|
Loading…
Reference in New Issue