• vs利用qt插件实现局域网聊天室


    1、概述

      本程序利用了Visual Studio 2010中寄存了qt5.5插件,利用qt5.5插件实现了局域网的聊天的功能,其中程序分为服务器端和客户端,利用服务器端开启服务器,客户端进行连接服务器,实现客户端和服务器端消息传递,多个客户端实现局域网聊天的功能。

    2、效果

      

        

    3、实现步骤

    3.1、下载软件

      切记:下载qt插件软件必须和Visual Studio版本相匹配。

      qt插件:

          链接:https://pan.baidu.com/s/1CWeMZTl4sxvKUoIn0ZWyLQ
          提取码:1593

      qt软件: 

          链接:https://pan.baidu.com/s/1kOz-DYku4jRtXozQ_kAtyQ
          提取码:1593

      Visual Studio 2010:

          链接:https://pan.baidu.com/s/1butkXJfPOIUjPohZLxWLDQ 

          提取码:1593 

    3.2、安装软件

    3.2.1、安装qt软件(qt-opensource-windows-x86-msvc2010-5.5.0)

      

       

       

       

       

       

       

       

     3.2.2、安装VS2010旗舰版.iso

       双击VS2010旗舰版.iso, 打开以下界面,选择autorun.exe

      

       因为我已经安装了vs2010软件,此处不再截屏分享,更具流程点击下一步即可,除开选择安装路径,不需要做任何修改。

    3.3.3、安装qt插件

      双击qt插件(qt-vs-addin-1.2.4-opensource)

      此处我已安装,系统会检测出已安装,所以也不作为截屏分享,按照安装流程,除安装路径可选择修改,其他均可以不做任何修改,点击下一步,安装即可。

    4、配置环境

      4.1、双击已安装的vs2010程序

      

       4.3、选择qt库文件

      

       

    5、新建项目

      新建服务器项目

      

       

       

       最后点击Finish完成

      

    6、编辑页面、编写服务器代码

      在编辑之前先编译,方便生成*.h文件的同时,以防出错

    6.1、双击如下图文件

      

       出现以下页面,利用控件编辑出以下页面

       

       6.2、代码编辑

      6.2.1头文件代码

    #ifndef LANCHAR_H

    #define LANCHAR_H

     

    #include <QtWidgets/QDialog>

    #include "ui_lanchar.h"

     

     

    #include <QTcpServer>

    #include <QTcpSocket>

    #include <QHostAddress>

    #include <QMessageBox>

     

     

    class lanChar : public QDialog

    {

    Q_OBJECT

     

    public:

    lanChar(QWidget *parent = 0);

    ~lanChar();

     

     

    private:

    //初始化server操作

    void initServer();

    public slots:

    void on_button_start_server_clicked();

    void on_button_set_news_clicked();

    void on_button_connect_server_clicked();

     

    void sltSocketRead();

    private:

    //创建全局服务器对象

    //存储已连接的socket对象

    //存取已连接的用户

    QList<QTcpSocket*> clientList;

    //创建服务器对象

    QTcpServer *server;

     

    //socket对象

    QTcpSocket *client;

     

    Ui::lanCharClass ui;

    };

     

     

    #endif // LANCHAR_H

    6.2.3、cpp中代码

    #include "lanchar.h"
    #include <winsock.h>


    lanChar::lanChar(QWidget *parent)
    : QDialog(parent)
    {
    ui.setupUi(this);

    client = NULL;
    }

    lanChar::~lanChar()
    {

    }


    void lanChar::initServer()
    {

    }
    //开启服务器按钮
    void lanChar::on_button_start_server_clicked(){
    //创建Server对象
    server = new QTcpServer(this);
    //获取ip地址
    const QString address_text=ui.lineEdit_address->text();
    const QHostAddress address=(address_text=="Any")
    ?QHostAddress::Any
    :QHostAddress(address_text);
    //获取端口号
    const unsigned short port=ui.lineEdit->text().toUShort();
    //开始监听,并判断是否成功
    if(server->listen(address,port)){
    //连接成功就将输入框提示服务器已开启
    ui.textRecv->append("The server is turned on");
    }

    connect(server, &QTcpServer::newConnection,[this](){
    //取出建立好连接的套接字
    client = server->nextPendingConnection();
    clientList.append(client);
    ui.textRecv->append(QString("[%1:%2] Soket Connected")
    .arg(client->peerAddress().toString())
    .arg(client->peerPort()));
    //QString li=client->peerAddress().toString();

    QObject::connect(client, SIGNAL(readyRead()), this, SLOT(sltSocketRead()));

    });
    //QObject::connect(client, SIGNAL(readyRead()), this, SLOT(sltSocketRead()));
    }


    void lanChar::on_button_set_news_clicked(){
    const QString get_data=ui.lineEdit_3->text();
    //判断是否开启了server
    if(!server->isListening())
    return;
    if (get_data==""){
    QMessageBox::about(NULL, "About","没有输入任何语句");
    return;
    }
    const QByteArray send_data=get_data.toUtf8();
    QTcpSocket *socket=server->nextPendingConnection();
    ui.textEdit_set_news->append(get_data);
    for(int i = 0; i < clientList.count(); i++)
    {
    socket = clientList.at(i);
    socket->write(send_data);
    }
    socket->flush();
    }

    void lanChar::on_button_connect_server_clicked(){
    server->close();
    ui.textRecv->append("The server is down!");
    for(int i = 0; i < clientList.count(); i++)
    {
    client->disconnectFromHost();
    if(client->state()!=QAbstractSocket::UnconnectedState){
    client->abort();
    }
    }
    }

    void lanChar::sltSocketRead()
    {
    ui.textEdit_get_news->append(client->readAll());
    }

    此处服务器端代码编写完成

     7、开始编辑客户端代码

      客户端和服务器端一样创建项目文件,编辑页面

    7.1、以下为头文件代码

    #ifndef QWE_H
    #define QWE_H

    #include <QtWidgets/QDialog>
    #include "ui_qwe.h"
    #include <QTcpServer>
    #include <QTcpSocket>
    #include <QHostAddress>
    #include <QMessageBox>

    class qwe : public QDialog
    {
    Q_OBJECT

    public:
    qwe(QWidget *parent = 0);
    ~qwe();

    public slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    private:
    QList<QTcpSocket*> clientList;

    //socket对象
    QTcpSocket *client;


    Ui::qweClass ui;

    };

    #endif // QWE_H

    7.2、以下为cpp文件代码

    #include "qwe.h"

    qwe::qwe(QWidget *parent)
    : QDialog(parent)
    {
    ui.setupUi(this);
    }

    qwe::~qwe()
    {

    }

    void qwe::on_pushButton_clicked(){

    /*连接服务器*/
    //实例化QtcpSocket对象
    client = new QTcpSocket(this);
    //连接服务器的ip
    const QString address=ui.lineEdit_2->text();
    //服务器的端口号
    const unsigned short port=ui.lineEdit->text().toUShort();
    //连接
    client->connectToHost(address,port);
    /*if(!(client->state()==QAbstractSocket::ConnectedState))
    ui.lineEdit_2->setText("The server is turned on");*/


    /*读取服务器消息*/
    connect(client,&QTcpSocket::readyRead,[=]{
    //没有可读的数据就返回
    if(client->bytesAvailable()<=0)
    return;
    //注意收发两端文本要使用对应的编解码
    const QString recv_text=QString::fromUtf8(client->readAll());
    ui.textEdit->append(recv_text);
    });
    }


    void qwe::on_pushButton_2_clicked(){

    const QString get_data=ui.lineEdit_3->text();
    ui.textEdit_2->append(get_data);
    const QByteArray send_data=get_data.toUtf8();
    client->write(send_data.data());
    }


    void qwe::on_pushButton_3_clicked(){
    client->disconnectFromHost();
    client->close();
    ui.textEdit->append("Server Disconnected");

    }

    此处项目以全部完成,点击运行编译即可

  • 相关阅读:
    dda的fpga实现(转载)
    第四篇:数据预处理(一)
    第三篇:数据可视化
    第二篇:数据可视化
    第一篇:查阅数据
    RocketMQ集群部署记录
    使用k8s cronjob ,清除应用生成的日志文件
    使用HostAliases 添加pod 的/etc/hosts
    docker in docker 出现 libltdl.so.7 问题
    容器中JVM获取真实的CPU核数
  • 原文地址:https://www.cnblogs.com/szmtjs10/p/14640445.html
Copyright © 2020-2023  润新知