Je fais donc des recherches sur les websockets, et j'ai quelques questions pour lesquelles je n'arrive pas à trouver une réponse définitive:
Comment puis-je configurer une socket Web sur mon serveur Linux? Existe-t-il un module Apache? Aurais-je avoir pour utiliser un code tiers PHP code ou similaire?
Existe-t-il des inconvénients à la méthode décrite à la question 1 dont je devrais être conscient autre que la compatibilité du navigateur?
Comment pourrais-je "mettre à niveau" mon installation Websocket vers une installation Websocket sécurisée (ws: // à wss: //)? Serait-ce rendu plus facile ou plus difficile si SSL était déjà configuré sur mon serveur Apache?
Existe-t-il une langue que je pourrais utiliser pour me connecter à ma prise Web autre que JavaScript?
Quelle est la méthode de demande par défaut pour un socket Web?
Je ne peux pas répondre à toutes les questions, mais je ferai de mon mieux.
Comme vous le savez déjà, WS n'est qu'une connexion full-duplex persistante TCP connexion avec des messages encadrés où la négociation initiale est de type HTTP. Vous avez besoin d'un serveur qui écoute les demandes WS entrantes et qui lie un gestionnaire pour eux.
Maintenant, cela pourrait être possible avec Apache HTTP Server, et j'ai vu quelques exemples, mais il n'y a pas de support officiel et cela se complique. Que ferait Apache? Où serait votre gestionnaire? Il existe un module qui transmet les demandes WS entrantes à une bibliothèque partagée externe, mais ce n'est pas nécessaire avec les autres excellents outils pour travailler avec WS.
Les tendances du serveur WS incluent désormais: Autobahn (Python) et Socket.IO (Node.js = JavaScript sur le serveur). Ce dernier prend également en charge d'autres connexions hackeuses "persistantes" comme les longues interrogations et toutes les choses COMÈTE . Il existe d'autres frameworks de serveurs WS peu connus comme Ratchet (PHP, si vous ne connaissez que cela).
Dans tous les cas, vous devrez écouter sur un port, et bien sûr ce port ne peut pas être le même que le serveur Apache HTTP déjà exécuté sur votre machine (par défaut = 80). Vous pouvez utiliser quelque chose comme 8080, mais même si celui-ci est un choix populaire, certains pare-feu peuvent toujours le bloquer car il n'est pas censé être du trafic Web. C'est pourquoi beaucoup de gens choisissent 443, qui est le port HTTP Secure que, pour des raisons évidentes, les pare-feu ne bloquent pas. Si vous n'utilisez pas SSL, vous pouvez utiliser 80 pour HTTP et 443 pour WS. Le serveur WS n'a pas besoin d'être sécurisé; nous utilisons simplement le port.
Edit : Selon Iharob Al Asimi, le paragraphe précédent est faux. Je n'ai pas le temps d'enquêter, alors veuillez consulter son travail pour plus de détails.
À propos du protocole, comme Wikipedia montre , il ressemble à ceci:
Le client envoie:
GET /mychat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
Origin: http://example.com
Réponses du serveur:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
et maintient la connexion vivante. Si vous pouvez implémenter cette négociation et le cadrage de base des messages (encapsulant chaque message avec un petit en-tête le décrivant), vous pouvez utiliser n'importe quel langage côté client que vous souhaitez. JavaScript n'est utilisé que dans les navigateurs Web car il est intégré.
Comme vous pouvez le voir, la "méthode de demande" par défaut est un HTTP GET initial, bien que ce ne soit pas vraiment HTTP et perd tout en commun avec HTTP après cette négociation. Je suppose que les serveurs qui ne prennent pas en charge
Upgrade: websocket
Connection: Upgrade
répondra avec une erreur ou avec un contenu de page.
La nouvelle version 2.4 d'Apache HTTP Server possède un module appelé mod_proxy_wstunnel qui est un proxy websocket.
http://httpd.Apache.org/docs/2.4/mod/mod_proxy_wstunnel.html
J'ai eu du mal à comprendre les paramètres de proxy pour websockets pour https alors laissez-moi mettre ici en évidence ce que j'ai réalisé.
Vous devez d'abord activer proxy
et proxy_wstunnel
Les modules Apache et le fichier de configuration Apache ressembleront à ceci.
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_project_public_folder
SSLEngine on
SSLCertificateFile /etc/ssl/certs/path_to_your_ssl_certificate
SSLCertificateKeyFile /etc/ssl/private/path_to_your_ssl_key
<Directory /var/www/your_project_public_folder>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
php_flag display_errors On
</Directory>
ProxyRequests Off
ProxyPass /wss/ ws://example.com:port_no
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>
</IfModule>
dans votre application frontale, utilisez l'url "wss://example.com/wss/"
ceci est très important surtout si vous êtes coincé avec des websockets vous pourriez faire une erreur dans l'url frontale. Vous avez probablement mis l'URL à tort comme ci-dessous.
wss://example.com:8080/wss/ -> port no should not be mentioned
ws://example.com/wss/ -> url should start with wss only.
wss://example.com/wss -> url should end with / -> most important
une partie également intéressante est la dernière /wss/
est identique à la valeur proxypass
si vous écrivez proxypass /ws/
puis dans la partie frontale, vous devez écrire /ws/
à la fin de l'URL.