折腾:
期间,继续去测试
结果用:
/Users/crifan/dev/dev_root/daryun/Projects/RunningFast/sourcecode/RunningFast-Server/runningfast/templates/index.html
<!DOCTYPE HTML> <html> <head> <title>Flask-SocketIO Test</title> <script type="text/javascript" src="//code.jquery.com/jquery-1.4.2.min.js"></script> <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script> <script> $(document).ready(function(){ var socket = io.connect(‘http://’ + document.domain + ‘:’ + location.port + ‘/test’); socket.on(‘my response’, function(msg) { $(‘#log’).append(‘<p>Received: ‘ + msg.data + ‘</p>’); }); $(‘form#emit’).submit(function(event) { socket.emit(‘my event’, {data: $(‘#emit_data’).val()}); return false; }); $(‘form#broadcast’).submit(function(event) { socket.emit(‘my broadcast event’, {data: $(‘#broadcast_data’).val()}); return false; }); }); </script> </head> <body> <h1>Flask-SocketIO Test</h1> <h2>Send:</h2> <table> <tr> <td> <form id="emit" method=’POST’ action=’#’> <textarea name="emit_data" id="emit_data"></textarea> <div><input type="submit" value="Emit"></div> </form> </td> <td> <form id="broadcast" method=’POST’ action=’#’> <textarea name="broadcast_data" id="broadcast_data"></textarea> <div><input type="submit" value="Broadcast"></div> </form> </td> </tr> </table> <h2>Receive:</h2> <div id="log"></div> </body> </html> |
加上对应的代码:
/Users/crifan/dev/dev_root/daryun/Projects/RunningFast/sourcecode/RunningFast-Server/runningfast/app.py
from flask import render_template from flask_socketio import SocketIO, emit @socketio.on(‘my event’, namespace=’/test’) def test_message(message): gLog.debug("message=%s", message) emit(‘my response’, {‘data’: message[‘data’]}) @socketio.on(‘my broadcast event’, namespace=’/test’) def test_message(message): gLog.debug("message=%s", message) emit(‘my response’, {‘data’: message[‘data’]}, broadcast=True) @socketio.on(‘connect’, namespace=’/test’) def test_connect(): gLog.debug("connect") emit(‘my response’, {‘data’: ‘Connected’}) @socketio.on(‘disconnect’, namespace=’/test’) def test_disconnect(): gLog.debug("Client disconnected") @app.route(‘/’) def index(): return render_template(‘index.html’) |
然后运行出错:
socket.io.min.js:2 WebSocket connection to ‘ws://115.29.173.126:21085/socket.io/?EIO=3&transport=websocket&sid=1eaac006a2004bf785dc6abf2e9cfe86’ failed: Error during WebSocket handshake: Unexpected response code: 400 socket.io.min.js:1 POST http://115.29.173.126:21085/socket.io/?EIO=3&transport=polling&t=1477642747986-1&sid=1eaac006a2004bf785dc6abf2e9cfe86 400 (BAD REQUEST) socket.io.min.js:1 GET http://115.29.173.126:21085/socket.io/?EIO=3&transport=polling&t=1477642764226-8 net::ERR_EMPTY_RESPONSE |
然后,终于有log输出了:
<div–<—————————————————————————— DEBUG in app [/root/RunningFast/staging/runningfast/app.py:181]: connect <div–<—————————————————————————— [2016-10-28 16:19:22 +0000] [29294] [CRITICAL] WORKER TIMEOUT (pid:29325) [2016-10-28 16:19:22 +0000] [29325] [INFO] Worker exiting (pid: 29325) [2016-10-28 16:19:22 +0000] [29337] [INFO] Booting worker with pid: 29337 <div–<—————————————————————————— DEBUG in app [/root/RunningFast/staging/runningfast/app.py:80]: app=<Flask ‘runningfast.app’>, api=<flask_restful.Api object at 0x7f05f1f101d0>, redis_store=<flask_redis.FlaskRedis object at 0x7f05f06ad950>, db=<SQLAlchemy engine=’mysql://runningfast:Jiandao123@localhost/runningfast_dev’>, server_mode=staging, server_type=develop, rq=<flask_rq2.app.RQ object at 0x7f05f1f10610>, socketio=<flask_socketio.SocketIO object at 0x7f05f1f10990> <div–<—————————————————————————— <div–<—————————————————————————— DEBUG in app [/root/RunningFast/staging/runningfast/app.py:200]: API_VERSION=1.0, API_URL_PREFIX=/runningfast/api/v1.0, OPEN_API_URL_PREFIX=/runningfast/api/v1.0/open <div–<—————————————————————————— [2016-10-28 16:19:23 +0000] [29319] [ERROR] Socket error processing request. Traceback (most recent call last): File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 135, in handle self.handle_request(listener, req, client, addr) File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 191, in handle_request six.reraise(*sys.exc_info()) File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/workers/sync.py", line 183, in handle_request resp.close() File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 418, in close self.send_headers() File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/http/wsgi.py", line 338, in send_headers util.write(self.sock, util.to_bytestring(header_str, "ascii")) File "/root/Envs/RunningFast/lib/python2.7/site-packages/gunicorn/util.py", line 302, in write sock.sendall(data) File "/usr/local/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) File "/usr/local/lib/python2.7/socket.py", line 174, in _dummy raise error(EBADF, ‘Bad file descriptor’) error: [Errno 9] Bad file descriptor |
Socket error processing request error Errno 9 Bad file descriptor
Flask-SocketIO Socket error processing request error Errno 9 Bad file descriptor
Python socket (Socket Error Bad File Descriptor) – Stack Overflow
python socket.error: [Errno 9] Bad file descriptor – Stack Overflow
[ERROR] Socket error processing request. · Issue #160 · miguelgrinberg/Flask-SocketIO · GitHub
确定是gunicorn, eventlet and gevent的问题。。。
当 socket 被关闭时,会报错 "error: [Errno 9] Bad file descriptor" · Issue #3 · duanhongyi/dwebsocket · GitHub
发生python socket.error: [Errno 9] Bad file descriptor,是什么原因? – 知乎
WebSocket connection to ‘ws://115.29.173.126:21085/socket.io/?EIO=3&transport=websocket&sid=1334737c86bb4105b5a3ef858cd9d8c9’ failed: WebSocket is closed before the connection is established. |
然后又出现其它错误:
socket.io.min.js:1 GET http://115.29.173.126:21085/socket.io/?EIO=3&transport=polling&t=1477645166484-114&sid=d458460494464830919e01657cc9347c net::ERR_EMPTY_RESPONSE socket.io.min.js:2 WebSocket connection to ‘ws://115.29.173.126:21085/socket.io/?EIO=3&transport=websocket&sid=2ac882f253a542eca75990148f1a4237’ failed: Error during WebSocket handshake: Unexpected response code: 400 |
Flask-SocketIO Error during WebSocket handshake Unexpected response code 400
说是要去修改nginx的配置
-》感觉不像啊。。。
Flask-SocketIO failed: WebSocket is closed before the connection is established
->
换成:
gevent就好了?
那去试试:
先去用:
pip uninstall eventlet
卸载eventlet
再去用:
pip install gevent
安装gevent
(RunningFast) ➜ staging pip uninstall eventlet Uninstalling eventlet-0.19.0: … /root/Envs/RunningFast/lib/python2.7/site-packages/eventlet/wsgi.pyc Proceed (y/n)? y Successfully uninstalled eventlet-0.19.0 (RunningFast) ➜ staging pip install gevent Collecting gevent Using cached gevent-1.1.2-cp27-cp27m-manylinux1_x86_64.whl Requirement already satisfied (use –upgrade to upgrade): greenlet>=0.4.9 in /root/Envs/RunningFast/lib/python2.7/site-packages (from gevent) Installing collected packages: gevent Successfully installed gevent-1.1.2 |
结果好像真的没有那些:
failed: WebSocket is closed before the connection is established.
failed: Error during WebSocket handshake: Unexpected response code: 400
了,
不过还有些其它错误:
【未解决】Flask-SocketIO测试出错:POST socket.io EIO 400 BAD REQUEST
【总结】
此处,测试Flask-SocketIO出现错误:
socket.io.min.js:1 GET http://115.29.173.126:21085/socket.io/?EIO=3&transport=polling&t=1477645166484-114&sid=d458460494464830919e01657cc9347c net::ERR_EMPTY_RESPONSE socket.io.min.js:2 WebSocket connection to ‘ws://115.29.173.126:21085/socket.io/?EIO=3&transport=websocket&sid=2ac882f253a542eca75990148f1a4237’ failed: Error during WebSocket handshake: Unexpected response code: 400 |
最终靠:
把eventlet换成gevent,就解决了此问题:
pip uninstall eventlet pip install gevent |
此处,列出目前的包,供参考:
(RunningFast) ➜ staging pip list alembic (0.8.8) aniso8601 (1.1.0) click (6.6) croniter (0.3.12) enum34 (1.1.6) Flask (0.11.1) Flask-HTTPAuth (3.2.1) Flask-Login (0.3.2) Flask-Migrate (2.0.0) Flask-Redis (0.3.0) Flask-RESTful (0.3.5) Flask-RQ2 (16.1.1) Flask-Script (2.0.5) Flask-SocketIO (2.7.1) Flask-SQLAlchemy (2.1) gevent (1.1.2) greenlet (0.4.10) gunicorn (19.6.0) itsdangerous (0.24) Jinja2 (2.8) Mako (1.0.4) MarkupSafe (0.23) meld3 (1.0.2) MySQL-python (1.2.5) pip (8.1.2) python-dateutil (2.5.3) python-editor (1.0.1) python-engineio (1.0.3) python-socketio (1.6.0) pytz (2016.6.1) redis (2.10.5) rq (0.6.0) rq-scheduler (0.7.0) setuptools (28.0.0) six (1.10.0) SQLAlchemy (1.1.1) supervisor (3.3.1) Werkzeug (0.11.11) wheel (0.30.0a0) |
转载请注明:在路上 » 【已解决】Flask-SocketIO测试出错:WebSocket connection to failed Error during WebSocket handshake Unexpected response code 400