Tôi đang sử dụng Flask cùng với gevent-socketio:gevent-socketio không sử dụng @ tôi app.route endpoint cho socketio
$ cat requirements.txt
Flask==0.10.1
Jinja2==2.7.1
MarkupSafe==0.18
Werkzeug==0.9.3
argparse==1.2.1
gevent==0.13.8
gevent-socketio==0.3.5-rc2
gevent-websocket==0.3.6
greenlet==0.4.1
itsdangerous==0.23
wsgiref==0.1.2
Tôi đang sử dụng một thiết lập khá tiêu chuẩn để khởi động server:
#Called from __main__
def run_dev_server():
app.debug = True
port = 5000
dapp = werkzeug.debug.DebuggedApplication(app, evalex = True)
SocketIOServer(('', port), dapp, resource="socket.io").serve_forever()
Và một cái móc khá chuẩn cho namespace SocketIO tôi:
@app.route('/socket.io/<path:rest>')
def push_stream(rest):
print 'ws connect', rest
try:
socketio.socketio_manage(request.environ, {'/join_notification': JoinsNamespace}, request)
except Exception as e:
app.logger.error("Exception while handling socketio connection", exc_info=True)
return flask.Response()
Tuy nhiên, tôi đang gặp vấn đề ở đâu 'kết nối' thậm chí ts không bị sa thải trên máy khách. Sau một chút đào bới, tôi nhận ra rằng mặc dù tôi nhận được thông báo 127.0.0.1 - - [2013-08-19 12:53:57] "GET /socket.io/1/websocket/170191232666 HTTP/1.1" 101 - -
ở đầu ra, tôi đã không nhận được thông báo ws connect
(trong khi các lệnh in khác trong mã hoạt động tốt). Tôi nhận xét rằng điểm cuối, và chắc chắn nó thậm chí không được gọi. Điều đó sẽ giải thích tại sao không gian tên của tôi không được sử dụng. Nhưng tại sao? Tôi có đăng ký không gian tên của mình sai không?
print app.url_map
sản lượng:
Map([<Rule '/' (HEAD, OPTIONS, GET) -> root>,
<Rule '/socket.io/<rest>' (HEAD, OPTIONS, GET) -> push_stream>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>])
Vì vậy, không có gì khác thường.
Chỉnh sửa: Mã khách hàng:
socket = io.connect('/join_notification')
console.log(socket)
socket.on('connect', function() {
console.log('connected to websocket')
socket.emit('login', {'name': data['name']})
})
socket.on('disconnect', function() {
console.log('d/c\'d from websocket')
})
socket.on('join_error', function() {
...
})
socket.on('join_success', function(data){
...
})
socket.on('join', function(data) {
...
})
Đăng mã khách hàng – leon
Đã thêm mã máy khách. – Rotten194
Nếu bạn đang nhận được /socket.io/1/ khi gọi kết nối, bạn đang làm điều gì đó sai. Kết nối nên được gọi với POST đến /socket.io/1/. Bằng cách bỏ phân đoạn tiếp theo, bạn đang khởi tạo một kết nối mới.Vì vậy, bạn đã kết nối và bạn đang nhận được phản hồi với "nội dung" ở cuối có nghĩa là nó hoạt động - hoặc bạn đang khởi tạo kết nối sai. Bây giờ, nếu nó hoạt động và nó không gọi mã CỦA BẠN, bạn có chắc là bạn đã khởi tạo không gian tên của mình một cách chính xác không? https://gevent-socketio.readthedocs.org/en/latest/namespace.html –
blakev