日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

websocket 聊天室 demo ( tornado + nginx + wss + 在线demo)

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 websocket 聊天室 demo ( tornado + nginx + wss + 在线demo) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在線demo(已停止服務(wù))

?

前端代碼(來源網(wǎng)友,自己稍作修改):?

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title> WebSocket ChatRoom </title><style>*{margin: 0;padding: 0;}.box{width: 800px;margin-left: auto;margin-right: auto;margin-top: 25px;}#text{width: 685px;height: 130px;border: 1px solid skyblue;border-radius: 10px;font-size: 20px;text-indent: 1em;resize:none;outline: none;}#text::placeholder{color: skyblue;}.btn{width: 100px;margin: -27px 0 0px 8px;}#messages{padding-left: 10px;font-size: 25px;}#messages li{list-style: none;color: #000;line-height: 30px;font-size: 18px;}</style> </head> <body><div class="box"><div><textarea id="text" placeholder="請(qǐng)輸入您的內(nèi)容"></textarea><a href="javascript:WebSocketSend();" class="btn btn-primary">發(fā)送</a></div><ul id="messages"></ul></div><script type="text/javascript">var mes = document.getElementById('messages');if('WebSocket' in window){ /*判斷瀏覽器是否支持WebSocket接口*//*創(chuàng)建創(chuàng)建 WebSocket 對(duì)象,協(xié)議本身使用新的ws://URL格式*/var Socket = new WebSocket("wss://10.0.0.189/wss/chat")/*連接建立時(shí)觸發(fā)*/Socket.onopen = function () {mes.innerHTML += "<br>連接已建立!╰( ̄▽ ̄)╮";//alert("連接已建立,可以進(jìn)行通信")};/*客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)*/Socket.onmessage = function (ev) {var received_msg = ev.data; /*接受消息*/var aLi = "<li>" + received_msg + "</li>";mes.innerHTML += aLi;/*jq方式*/// $(mes).append($(aLi));};/*連接關(guān)閉時(shí)觸發(fā)*/Socket.onclose = function () {mes.innerHTML += "<br>連接已經(jīng)關(guān)閉...(┬_┬)";};}else{/*瀏覽器不支持 WebSocket*/alert("您的瀏覽器不支持 WebSocket!");}function WebSocketSend() {/*form 里的Dom元素(input select checkbox textarea radio)都是value*/var send_msg = document.getElementById('text').value;//或者JQ中獲取// var send_msg = $("#text").val();/*使用連接發(fā)送消息*/Socket.send(send_msg);}</script> </body> </html>

后端代碼(來源網(wǎng)友,自己稍作修改):

# coding:utf-8import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import os import datetimefrom tornado.web import RequestHandler from tornado.options import define, options from tornado.websocket import WebSocketHandlerdefine("port", default=8000, type=int)class IndexHandler(RequestHandler):def get(self):self.render("index.html")class ChatHandler(WebSocketHandler):users = set() # 用來存放在線用戶的容器def open(self):self.users.add(self) # 建立連接后添加用戶到容器中for u in self.users: # 向已在線用戶發(fā)送消息print("user count {}".format(len(self.users)))u.write_message(u"[%s]-[%s]-進(jìn)入聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))print("{} enter room".format(self.request.remote_ip))def on_message(self, message):for u in self.users: # 向在線用戶廣播消息u.write_message(u"[%s]-[%s]-說:%s" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), message))print("{} says {}".format(self.request.remote_ip, message))def on_close(self):self.users.remove(self) # 用戶關(guān)閉連接后從容器中移除用戶for u in self.users:u.write_message(u"[%s]-[%s]-離開聊天室" % (self.request.remote_ip, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))print("{} leave room".format(self.request.remote_ip))def check_origin(self, origin):# 接受所有跨源流量return True# 若要允許來自站點(diǎn)任何子域的連接,您可以執(zhí)行如下操作:# parsed_origin = urllib.parse.urlparse(origin)# return parsed_origin.netloc.endswith(".mydomain.com")if __name__ == '__main__':tornado.options.parse_command_line()app = tornado.web.Application([(r"/", IndexHandler),(r"/wss/chat", ChatHandler),],static_path = os.path.join(os.path.dirname(__file__), "static"),template_path = os.path.join(os.path.dirname(__file__), "template"),debug = True)http_server = tornado.httpserver.HTTPServer(app, xheaders=True)http_server.listen(options.port)tornado.ioloop.IOLoop.current().start()

配置NGINX,運(yùn)行代碼:

1. 準(zhǔn)備工作: 找一臺(tái)虛擬機(jī)或服務(wù)器, 安裝nginx, python3.6, tornado,把后端代碼拷貝上去。

2. nginx配置:

/etc/nginx/conf.d 下新增個(gè)文件 wss.conf

server_tokens off;upstream wss_svr {server 127.0.0.1:8000; }server{listen 80;server_name 10.0.0.189;add_header Strict-Transport-Security max-age=15768000;return 301 https://$server_name$request_uri; }server {listen 443;server_name 10.0.0.189;ssl on;index index.html index.htm;ssl_certificate cert/10.0.0.189.crt;ssl_certificate_key cert/10.0.0.189.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;location /ws {alias /var/www/web_chat/;index index.html;}location /wss {proxy_redirect off;proxy_pass http://wss_svr;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $remote_addr:$remote_port;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection upgrade;proxy_read_timeout 180s;} }

3. 本地生成證書,放在?/etc/nginx/cert 目錄下,?證書腳本如下,生成時(shí)輸入服務(wù)器ip地址

read -p "Enter your domain [www.example.com]: " DOMAINecho "Create server key..." openssl genrsa -des3 -out $DOMAIN.key 1024echo "Create server certificate signing request..." SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN" openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csrecho "Remove password..." mv $DOMAIN.key $DOMAIN.origin.key openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.keyecho "Sign SSL certificate..." openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crtecho "TODO:" echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt" echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"echo "Add configuration in nginx:" echo "server {" echo " ..." echo " listen 443 ssl;" echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;" echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;" echo "}"

4. 啟動(dòng)nginx

service nginx start

5. 運(yùn)行代碼

python wss.py

6. 打開前端代碼寫的html,即可看到界面

效果

?打開時(shí)頁(yè)面:

輸入文字時(shí):

服務(wù)器打印:

?問題:

服務(wù)器打印的遠(yuǎn)端IP成了127.0.0.1,不是真實(shí)的IP地址。

這個(gè)問題涉及2個(gè)地方,一個(gè)是nginx配置,一個(gè)是tornado代碼

nginx配置是沒得問題的:

那就是tornado了,因?yàn)闆]加??xheaders=True

http_server = tornado.httpserver.HTTPServer(app, xheaders=True)

OK,完美解決

?

總結(jié)

以上是生活随笔為你收集整理的websocket 聊天室 demo ( tornado + nginx + wss + 在线demo)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。