libevent服务器附带qt界面开发(附带源码)

打印 上一主题 下一主题

主题 1831|帖子 1831|积分 5493


1.重要功能有登录界面
2.基于libevent实现的服务器的业务功能
利用qt编译libevent

下载这个,其他版本也可以
重要是github上下载,可能有点卡
链接: link


编译流程
1.打开qt然后点下面的红框

2.选cmakelist

3.选编译器

4.最后一步编译

5.编译乐成后库的位置


最后编译乐成后可以丢到/usr/bin里也可以丢到自己的写的步伐的目次下
源码

源码布局如下

下面是libeventuse.cpp
  1. #include "libeventuse.h"
  2. #include <string.h>
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <signal.h>
  6. #ifndef _WIN32
  7. #include <netinet/in.h>
  8. # ifdef _XOPEN_SOURCE_EXTENDED
  9. #  include <arpa/inet.h>
  10. # endif
  11. #include <sys/socket.h>
  12. #endif
  13. #include <event2/bufferevent.h>
  14. #include <event2/buffer.h>
  15. #include <event2/listener.h>
  16. #include <event2/util.h>
  17. #include <event2/event.h>
  18. #include"qdebug.h"
  19. static const char MESSAGE[] = "Hello, World!\n";
  20. static const unsigned short PORT = 9995;
  21. static void listener_cb(struct evconnlistener *, evutil_socket_t,
  22.     struct sockaddr *, int socklen, void *);
  23. static void conn_writecb(struct bufferevent *, void *);
  24. static void conn_eventcb(struct bufferevent *, short, void *);
  25. static void signal_cb(evutil_socket_t, short, void *);
  26. int main3()
  27. {
  28.     struct event_base *base;
  29.     struct evconnlistener *listener;
  30.     struct event *signal_event;
  31.     struct sockaddr_in sin = {0};
  32.     base = event_base_new();//初始化
  33.     if (!base) {
  34.         fprintf(stderr, "Could not initialize libevent!\n");
  35.         return 1;
  36.     }
  37.     sin.sin_family = AF_INET;
  38.     sin.sin_port = htons(PORT);
  39.     listener = evconnlistener_new_bind(base, listener_cb, (void *)base,
  40.         LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, -1,
  41.         (struct sockaddr*)&sin,
  42.         sizeof(sin));//事件监听
  43.     if (!listener) {
  44.         fprintf(stderr, "Could not create a listener!\n");
  45.         return 1;
  46.     }
  47.     signal_event = evsignal_new(base, SIGINT, signal_cb, (void *)base);//信号事件
  48.     if (!signal_event || event_add(signal_event, NULL)<0) {
  49.         fprintf(stderr, "Could not create/add a signal event!\n");
  50.         return 1;
  51.     }
  52.     event_base_dispatch(base);//启动
  53.     evconnlistener_free(listener);
  54.     event_free(signal_event);
  55.     event_base_free(base);
  56.     printf("done\n");
  57.     return 0;
  58. }
  59. static void
  60. listener_cb(struct evconnlistener *listener, evutil_socket_t fd,
  61.     struct sockaddr *sa, int socklen, void *user_data)
  62. {
  63.     struct event_base *base = static_cast<event_base*>(user_data);
  64.     struct bufferevent *bev;
  65.     bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);
  66.     if (!bev) {
  67.         fprintf(stderr, "Error constructing bufferevent!");
  68.         event_base_loopbreak(base);
  69.         return;
  70.     }
  71.     bufferevent_setcb(bev, NULL, conn_writecb, conn_eventcb, NULL);
  72.     bufferevent_enable(bev, EV_WRITE);
  73.     bufferevent_disable(bev, EV_READ);
  74.     bufferevent_write(bev, MESSAGE, strlen(MESSAGE));
  75. }
  76. static void
  77. conn_writecb(struct bufferevent *bev, void *user_data)
  78. {
  79.     struct evbuffer *output = bufferevent_get_output(bev);
  80.     if (evbuffer_get_length(output) == 0) {
  81.         printf("flushed answer\n");
  82.         bufferevent_free(bev);
  83.     }
  84. }
  85. static void
  86. conn_eventcb(struct bufferevent *bev, short events, void *user_data)
  87. {
  88.     if (events & BEV_EVENT_EOF) {
  89.         printf("Connection closed.\n");
  90.     } else if (events & BEV_EVENT_ERROR) {
  91.         printf("Got an error on the connection: %s\n",
  92.             strerror(errno));/*XXX win32*/
  93.     }
  94.     /* None of the other events can happen here, since we haven't enabled
  95.      * timeouts */
  96.     bufferevent_free(bev);
  97. }
  98. static void
  99. signal_cb(evutil_socket_t sig, short events, void *user_data)
  100. {
  101.     struct event_base *base = static_cast<event_base*>(user_data);
  102.     struct timeval delay = { 2, 0 };
  103.     printf("Caught an interrupt signal; exiting cleanly in two seconds.\n");
  104.     event_base_loopexit(base, &delay);
  105. }
  106. libeventuse::libeventuse()
  107. {
  108.     main3();
  109. }
复制代码
下面是mainwindow.cpp
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "ui_form.h"
  4. #include"QString"
  5. #include"qdebug.h"
  6. #include"qmessagebox.h"
  7. #include"libeventuse.h"
  8. #include <QMutex>
  9. #include <QTime>
  10. #include <QWidget>
  11. WorkThread::WorkThread(QObject *parent) : QThread(parent) {}
  12. void WorkThread::run() {  // 必须实现 run()
  13. libeventuse tmp;
  14. emit this->server_finish();
  15. }
  16. MainWindow::MainWindow(QWidget *parent) :
  17.     QMainWindow(parent),
  18.     ui(new Ui::MainWindow)
  19. {
  20.     ui->setupUi(this);
  21.    login_win=new Form;
  22.    workthread=new WorkThread;
  23.    login_win->hide();//登录窗口打开
  24.    workthread->start();
  25.    connect(this->workthread,&WorkThread::server_finish,[=](){
  26.             qDebug()<<"服务器关闭";
  27.    });
  28.    connect(this->workthread,&WorkThread::finished,this->workthread,&QObject::deleteLater);
  29.    connect(this->login_win,&Form::back,[=](){//槽函数
  30.        this->show();//返回登录界面
  31.        this->login_win->hide();//主执行界面关闭
  32.    });
  33. }
  34. MainWindow::~MainWindow()
  35. {
  36.     delete login_win;
  37.     delete ui;
  38. }
  39. Form::Form(QWidget *parent) :
  40.     QWidget(parent),
  41.     ui(new Ui::Form)
  42. {
  43.     ui->setupUi(this);
  44. }
  45. Form::~Form()
  46. {
  47.     delete ui;
  48. }
  49. void MainWindow::on_pushButton_clicked()
  50. {
  51.     QString RootName=ui->rootName->text();
  52.     QString Password=ui->password->text();
  53.     if(RootName.size()==0)
  54.     {
  55.        QMessageBox::information(this, tr("提示"), tr("用户名没有输入"));
  56.        return ;
  57.     }
  58.     else if(RootName.size()==0)
  59.     {
  60.         QMessageBox::information(this, tr("提示"), tr("密码没有输入"));
  61.     }
  62.     if(RootName=="i"&&Password=="1")//验证用户和密码
  63.     {
  64.         qDebug()<<RootName<<Password;
  65.         login_win->show();//主执行界面打开
  66.         this->hide();//登录界面关闭
  67.     }
  68.     else
  69.     {
  70.           QMessageBox::information(this, tr("提示"), tr("用户或密码输入错误"));
  71.     }
  72. }
  73. void Form::on_pushButton_clicked()
  74. {
  75.     emit this->back();//发送信号
  76. }
  77. void MainWindow::on_pushButton_2_clicked()
  78. {
  79. }
复制代码
下面是libeventuse.h
  1. #ifndef LIBEVENTUSE_H
  2. #define LIBEVENTUSE_H
  3. class libeventuse
  4. {
  5. public:
  6.     libeventuse();
  7. };
  8. #endif // LIBEVENTUSE_H
复制代码
下面是mainwindow.h
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. namespace Ui {
  5. class Form;
  6. }
  7. class Form : public QWidget
  8. {
  9.     Q_OBJECT
  10. public:
  11.     explicit Form(QWidget *parent = 0);
  12.     ~Form();
  13. private slots:
  14.     void on_pushButton_clicked();
  15. signals:
  16.     void back();
  17. private:
  18.     Ui::Form *ui;
  19. };
  20. #include <QThread>
  21. class WorkThread : public QThread {
  22.     Q_OBJECT  // 必须添加!!!
  23. public:
  24.     explicit WorkThread(QObject *parent = nullptr);
  25. protected:
  26.     void run() override;  // 虚函数声明
  27. signals:
  28. void WorkThread_signal(int b);//自定义的信号
  29. void server_finish();
  30. };
  31. namespace Ui {
  32. class MainWindow;
  33. }
  34. class MainWindow : public QMainWindow
  35. {
  36.     Q_OBJECT
  37. public:
  38.     explicit MainWindow(QWidget *parent = 0);
  39.     ~MainWindow();
  40.    Form* login_win=nullptr;
  41.    WorkThread*workthread=nullptr;
  42. private slots:
  43.    void on_pushButton_clicked();
  44.    void on_pushButton_2_clicked();
  45. private:
  46.     Ui::MainWindow *ui;
  47. };
  48. #endif // MAINWINDOW_H
复制代码
pro文件的设置

演示视频


     20250415_153450
  
我视频第一部门展示了怎样在qt创建窗口
视频第二部门展示了客户端连接到服务器后会接收到hello world
视频等考核过了我再放上来
考核没过我就发效果图

qt的一些知识


1.信号的格式
signals:
void WorkThread_signal(int b);//自定义的信号
2.注意事项,需要分写入Q_OBJECT才能这么定义
3.信号发送利用 emit 发送

4.利用connect槽函数来绑定信号要处理的逻辑


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表