使用Qt QWebSocketServer与QWebSocket写的聊天室(c++)

使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值