使用Qwebsocket和Qwebsocketserver写的聊天室 借鉴了SpecofDust大神的代码。
服务器代码
Serverdialog.h
#pragma once
#include <QtWidgets/QWidget>
#include <QWebSocketServer>
#include <QWebSocket>
#include <QHash>
#include <QString>
#include "ui_Serverdialog.h"
class Serverdialog : public QWidget
{
Q_OBJECT
public:
Serverdialog(QWidget *parent = Q_NULLPTR);
private Q_SLOTS:
void onNewConnection();//客户端连接后执行槽
void processTextMessage(QString message);//客户端发送信息后处理槽
void socketDisconnected();//客户端断开后槽
void huoqumingzi(QByteArray message);//客户端断开后服务器所要处理的事情
Q_SIGNALS:
void closed();
private:
Ui::ServerdialogClass ui;
int i;
QString mingzi;
QString mingzi1;
QString name1;//换行需要
QMetaObject::Connection Connection1;
QWebSocketServer* m_WebSocketServer;
QHash <QString, QWebSocket*> m_clients;
bool m_debug;
QWebSocket* pSocket;
QDateTime* current_date_time;
private slots:
void onStartButtonClick();//UI界面开始按钮槽
void onStopButtonClick();//UI界面关闭按钮槽
void onSendButtonClick(); //UI界面发送信息按钮槽
void SetName(QString name);//存储客户端信息函数
void listRowChanged(int row);//私法选择槽
};
Serverdialog.cpp
#include "Serverdialog.h"
#include <QWebSocketServer>
#include <QMetaObject>
Serverdialog::Serverdialog(QWidget *parent)
: QWidget(parent)
{
i = 0;
m_WebSocketServer = new QWebSocketServer("server", QWebSocketServer::NonSecureMode);
connect(m_WebSocketServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
ui.setupUi(this);
}
void Serverdialog::onStartButtonClick() {
connect(ui.m_linkclientListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(listRowChanged(int)));//私聊
int i_port = ui.m_monitorSpinBox->text().toInt();
m_WebSocketServer->listen(QHostAddress::Any, i_port);
ui.m_startButton->setEnabled(false);
ui.m_stopButton->setEnabled(true);
qDebug() << m_WebSocketServer->isListening();
qDebug() << m_WebSocketServer->serverPort();
qDebug() << m_WebSocketServer->serverAddress();
}
void Serverdialog::onNewConnection() {
qDebug() << "hello";
i++;
ui.zaixianNumber->display(i);
ui.m_startButton->setEnabled(false);
ui.m_stopButton->setEnabled(true);
ui.m_sendTextedit->setEnabled(true);
ui.m_sendButton->setEnabled(true);
pSocket = m_WebSocketServer->nextPendingConnection();///
connect(pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
Connection1 = connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(SetName(QString)));
}
void Serverdialog::onStopButtonClick() {
ui.m_startButton->setEnabled(true);
ui.m_stopButton->setEnabled(false);
disconnect(ui.m_linkclientListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(listRowChanged(int)));
ui.m_linkclientListWidget->clear();
ui.m_linkclientListWidget->addItem("hall");
ui.zaixianNumber->display(0);
m_WebSocketServer->close();
}
void Serverdialog::SetName(QString name) {
mingzi1 = name;
ui.m_linkclientListWidget->addItem(name);
disconnect(Connection1);
connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(processTextMessage(QString)));
connect(pSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(huoqumingzi(QByteArray)));///
m_clients.insert(mingzi1, pSocket);
QHash<QString, QWebSocket*>::const_iterator mi;
for (mi = m_clients.constBegin(); mi != m_clients.constEnd(); mi++) {
QString str = QString::number(i);
QByteArray bytes = str.toUtf8();
mi.value()->sendBinaryMessage(bytes);
}
QHash<QString, QWebSocket*>::const_iterator mi11;
for (mi11 = m_clients.constBegin(); mi11 != m_clients.constEnd(); mi11++) {
QString s;
QHash<QString, QWebSocket*>::const_iterator mi2;
for (mi2 = m_clients.constBegin(); mi2 != m_clients.constEnd(); mi2++) {
if (mi2 != m_clients.constBegin())
s = s + "/" + mi2.key();
else
s = mi2.key();
}
mi11.value()->sendTextMessage(s);
}
}
void Serverdialog::onSendButtonClick() {
QString msg = ui.m_sendTextedit->document()->toPlainText();
QString key = name1;
QString time = current_date_time->currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
if (name1 == "hall") {
QHash<QString, QWebSocket*>::const_iterator mi12;
for (mi12 = m_clients.constBegin(); mi12 != m_clients.constEnd(); mi12++) {
mi12.value()->sendTextMessage(time + "server:" + "\n" + msg);
}
}
else if (m_clients.contains(key))
{
m_clients.value(key)->sendTextMessage(time + "server:" + "\n" + msg);
}
}
void Serverdialog::processTextMessage(QString message){
QString str;
str = message.section(",", 1, 1);
QHash<QString, QWebSocket*>::iterator mi;
mi = m_clients.find(str);
if (mi != m_clients.end())
mi.value()->sendTextMessage(message);
else {
QHash<QString, QWebSocket*>::const_iterator mi12;
for (mi12 = m_clients.constBegin(); mi12 != m_clients.constEnd(); mi12++) {
mi12.value()->sendTextMessage(message);
}
}
ui.m_receiveTextEdit->append(message);
}
void Serverdialog::socketDisconnected(){
ui.m_startButton->setEnabled(false);
ui.m_stopButton->setEnabled(true);
ui.m_sendButton->setEnabled(true);
ui.m_sendTextedit->setEnabled(true);
ui.m_receiveTextEdit->setEnabled(true);
}
void Serverdialog::huoqumingzi(QByteArray message) {
disconnect(ui.m_linkclientListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(listRowChanged(int)));
ui.m_linkclientList