Petit serveur Web
Le serveur Web léger C++ sous Linux aide les débutants à pratiquer rapidement la programmation réseau et à créer leur propre serveur.
- Modèle de concurrence utilisant un pool de threads + socket non bloquant + epoll (implémenté par ET et LT) + traitement d'événements (implémenté par Reactor et Proactor simulé)
- Utiliser la machine d'état pour analyser les messages de requête HTTP, prendre en charge l'analyse des requêtes GET et POST
- Accédez à la base de données du serveur pour mettre en œuvre les fonctions d'enregistrement et de connexion des utilisateurs Web, et pouvez demander des images et des fichiers vidéo au serveur.
- Implémenter un système de journalisation synchrone/asynchrone pour enregistrer l'état de fonctionnement du serveur
- Après le test de résistance Webbench , des dizaines de milliers d'échanges simultanés de données de connexion peuvent être réalisés
écrire devant
- Lors du développement et de la maintenance de ce projet, de nombreuses chaussures pour enfants se sont vu offrir des enveloppes rouges pour me soutenir, mais je les ai toutes déclinées. Je ne regrouperai pas et je ne regrouperai pas à l'avenir ce projet dans des cours à vendre, et je n'ouvrirai aucun canal d'assistance.
- À l'heure actuelle, il y a des gens sur Internet qui regroupent ce projet ou le projet de Youshuangdao dans des cours à vendre. Veuillez garder les yeux ouverts et identifier les projets de serveur C++ des principaux sites Web d’apprentissage/de recherche d’emploi, et ne payez pas aveuglément.
- Un intervieweur principal m'a trouvé dans l'entreprise grâce aux informations sur le projet et a découvert que de nombreux CV d'enfants utilisaient ce projet. Toutefois, au cours de l'entretien, j'ai constaté que
很多童鞋通过本项目入门了,但是对于一些东西还是属于知其然不知其所以然的状态,需要加强下基础知识的学习
. .- "Programmation avancée dans un environnement Unix"
- "programmation réseau Unix"
- Merci à tous les patrons, amis et chaussures d'enfants pour votre reconnaissance et votre soutien. Ce serait un grand honneur pour moi si ce projet pouvait vous aider à démarrer.
Table des matières
Aperçu | cadre | Démo | test de résistance | Journal des modifications | Téléchargement du code source | Courez vite | Fonctionnement personnalisé | Cuisinier Ding Jie Niu | Mise en œuvre du RPC11 | Remerciements |
---|
Aperçu
- C/C++
- Modèle B/S
- Classe wrapper du mécanisme de synchronisation des threads
- classe de traitement des demandes de connexion http
- Pool de threads semi-synchrone/semi-réacteur
- Minuterie pour gérer les connexions inactives
- Système de journalisation synchrone/asynchrone
- Pool de connexions à la base de données
- Enregistrement de fil synchrone et vérification de connexion
- Test de stress simple du serveur
cadre
Démo
- Inscrivez-vous pour une démo
- Demander une démonstration de fichier image (6 Mo)
- Demander une démonstration de fichier vidéo (39M)
test de résistance
Après avoir fermé le journal, utilisez Webbench pour effectuer un test de résistance sur le serveur. Utilisez les modes ET et LT respectivement pour Listenfd et Connfd. Les deux peuvent atteindre des dizaines de milliers de connexions simultanées. Vous trouverez ci-dessous les résultats des tests après la combinaison des deux.
- Proactor, LT + LT, 93251 QPS
- Proactor, LT + ET, 97459 QPS
- Proactor, ET + LT, 80498 QPS
- Proactor, ET + ET, 92167 QPS
- Réacteur, LT + ET, 69175 QPS
- Nombre total de connexions simultanées : 10 500
- Temps d'accès au serveur : 5 s
- Tous les accès ont réussi
Remarque : lors de l'utilisation du webbench de ce projet pour des tests de résistance, si un message d'erreur indique que la commande webbench est introuvable, supprimez le fichier exécutable webbench et recompilez-le.
Journal des modifications
Téléchargement du code source
Il existe actuellement deux versions. Il y a des changements majeurs dans la structure du code entre les versions, et la documentation et les méthodes d'exécution du code sont également incohérentes. La version refactorisée est plus concise et la version originale (raw_version) est plus grande, conservant la saveur originale du code Youshuang, et il est plus facile de commencer avec la version originale.
Si vous rencontrez un échec lors du téléchargement du code github ou si l'accès est trop lent, vous pouvez le télécharger à partir du lien suivant et le synchroniser avec la dernière soumission Github.
- Adresse de téléchargement de la version refactorisée : BaiduYun
- Adresse de téléchargement de la version originale (raw_version) : BaiduYun
- Code d'extraction : 9wye
- Pour exécuter la version originale, veuillez vous référer à la documentation originale.
Courez vite
Environnement de test du serveur
- Ubuntu version 16.04
- MySQL version 5.7.29
Environnement de test du navigateur
- Windows et Linux sont disponibles
- Chrome
- FireFox
- Pas de test sur d'autres navigateurs pour l'instant
Assurez-vous que la base de données MySQL est installée avant de tester
// 建立yourdb库
create database yourdb;
// 创建user表
USE yourdb;
CREATE TABLE user (
username char ( 50 ) NULL,
passwd char( 50 ) NULL
)ENGINE=InnoDB;
// 添加数据
INSERT INTO user (username, passwd) VALUES( ' name ' , ' passwd ' );
Modifier les informations d'initialisation de la base de données dans main.cpp
//数据库登录名,密码,库名
string user = " root " ;
string passwd = " root " ;
string databasename = " yourdb " ;
construire
Démarrer le serveur
Côté navigateur
Fonctionnement personnalisé
./server [-p port] [-l LOGWrite] [-m TRIGMode] [-o OPT_LINGER] [-s sql_num] [-t thread_num] [-c close_log] [-a actor_model]
Rappel chaleureux : les paramètres ci-dessus ne sont pas nécessaires, vous n'avez pas besoin de tous les utiliser, vous pouvez les choisir en fonction de votre situation personnelle.
- -p, numéro de port personnalisé
- -l, sélectionnez la méthode d'écriture du journal, la valeur par défaut est l'écriture synchrone
- 0, écriture synchrone
- 1. Écriture asynchrone
- -m, combinaison de modes d'écoute et de connfd, par défaut LT + LT
- 0, signifie utiliser LT + LT
- 1, signifie utiliser LT + ET
- 2, signifie utiliser ET + LT
- 3, signifie utiliser ET + ET
- -o, ferme la connexion correctement, non utilisé par défaut
- 0, non utilisé
- 1. Utiliser
- -s, nombre de connexions à la base de données
- La valeur par défaut est 8
- -t, nombre de threads
- La valeur par défaut est 8
- -c, ferme le journal, ouvre par défaut
- 0, ouvre le journal
- 1. Fermez le journal
- -a, sélectionnez le modèle de réacteur, la valeur par défaut est Proactor
- 0, modèle Proactor
- 1. Modèle de réacteur
Tester des exemples de commandes et de significations
./server -p 9007 -l 1 -m 0 -o 1 -s 10 -t 10 -c 1 -a 1
Cuisinier Ding Jie Niu
L'itération de la version récente est plus rapide et le contenu suivant est principalement basé sur le code de l'ancienne version (raw_version) pour une explication détaillée.
- Le point de vue d’un novice : comprenez le TinyWebServer du président en un seul article
- Explication détaillée de la dernière version du projet de serveur Web - 01 Classe d'encapsulation du mécanisme de synchronisation des threads
- Explication détaillée de la dernière version du projet de serveur Web - 02 Pool de threads semi-synchrone semi-réacteur (Partie 1)
- Explication détaillée de la dernière version du projet de serveur Web - 03 Pool de threads semi-synchrone semi-réacteur (Partie 2)
- Explication détaillée de la dernière version du projet de serveur Web - 04 traitement de la connexion http (Partie 1)
- Explication détaillée de la dernière version du projet de serveur Web - 05 Traitement de la connexion http (Partie 2)
- Explication détaillée de la dernière version du projet de serveur Web - 06 Traitement de la connexion http (Partie 2)
- Explication détaillée de la dernière version du projet de serveur Web - 07 Traitement par minuterie des connexions inactives (Partie 1)
- Explication détaillée de la dernière version du projet de serveur Web - 08 Traitement par minuterie des connexions inactives (Partie 2)
- Explication détaillée de la dernière version du projet de serveur Web - 09 Système de journalisation (Partie 1)
- Explication détaillée de la dernière version du projet de serveur Web - 10 Système de journalisation (Partie 2)
- Explication détaillée de la dernière version du projet de serveur Web - 11 Pool de connexions à la base de données
- Explication détaillée de la dernière version du projet de serveur Web - 12 Inscrivez-vous et connectez-vous
- Explication détaillée de la dernière version du projet de serveur Web - 13 pièges et questions d'entretien
- Mis à jour
Histoire des étoiles
Mise en œuvre du RPC11
Une implémentation CPP11 plus simple et plus élégante : Webserver
Remerciements
Programmation serveur Linux haute performance, écrite par You Shuang.
Merci aux amis suivants pour leurs relations publiques et leur aide : @RownH, @mapleFU, @ZWiley, @zjuHong, @mamil, @byfate, @MaJun827, @BBLiu-coder, @smoky96, @yfBong, @liuwuyao, @Huixxi, @markparticle , @blogg9ggg.