#include "websocketsever.h"
#include <QHostAddress>
#include <cstdio>
using namespace std;
QT_USE_NAMESPACE
static QString getIdentifier(QWebSocket *peer) {
return QStringLiteral("%1:%2").arg(peer->peerAddress().toString(),
QString::number(peer->peerPort()));
}
WebSocketSever::WebSocketSever(quint16 port, QObject *parent)
: QObject(parent) {
m_WebSocketServer = new QWebSocketServer(QStringLiteral("Chat Server"),
QWebSocketServer::NonSecureMode, this);
if (m_WebSocketServer->listen(QHostAddress::Any, port)) {
connect(m_WebSocketServer, &QWebSocketServer::newConnection,
this, &WebSocketSever::onNewConnection);
emit sigRecvMsg("start listening: " + QString::number(port));
}
}
WebSocketSever::~WebSocketSever() {
m_WebSocketServer->close();
}
void WebSocketSever::sendTextMsg(QString msg) {
for (int i = 0; i < m_clients.size(); i++) {
m_clients.at(i)->sendTextMessage(msg);
}
}
//连接上之后
void WebSocketSever::onNewConnection() {
pSocket = m_WebSocketServer->nextPendingConnection();
emit sigConnectMsg(getIdentifier(pSocket));
emit sigRecvMsg("new connect: " + getIdentifier(pSocket));
pSocket->setParent(this);
connect(pSocket, &QWebSocket::textMessageReceived,
this, &WebSocketSever::processTextMessage);
connect(pSocket, &QWebSocket::disconnected,
this, &WebSocketSever::socketDisconnected);
m_clients << pSocket;
}
//收到消息并显示
void WebSocketSever::processTextMessage(QString message) {
QString time = current_date_time->currentDateTime().toString("hh:mm:ss");
QString item = getIdentifier(pSocket);
sigRecvMsg(time + item + " recv:" + message);
}
//连接断开的操作
void WebSocketSever::socketDisconnected() {
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
emit sigRecvMsg("disconnect: " + getIdentifier(pClient));
if (pClient) {
m_clients.removeAll(pClient);
pClient->deleteLater();
}
}
void WebSocketSever::sendMsg(QString str, QString ID) {
if(str.isEmpty() || 0 == m_clients.size()) {
return;
}
qDebug() << str << ID;
//QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
QString time = current_date_time->currentDateTime().toString("hh:mm:ss");
QString item = getIdentifier(pSocket);
for (QWebSocket *pClient : qAsConst(m_clients)) {
if (getIdentifier(pClient) == ID) {
pClient->sendTextMessage(str);
emit sigRecvMsg(time + item + " send:" + str);
} else {
qDebug() << getIdentifier(pClient);
}
}
}