服务器创建后的Python SocketIO发出事件

时间:2016-05-13 15:43:31

标签: javascript python socket.io eventlet flask-socketio

我有一个使用php的web项目和一个修改文件夹的python脚本。 我想基于例如在网站上执行一些javascript。在python脚本中完成文件夹创建。

我的想法是使用python socketio。我有基本的连接通知工作,从网站上的js发出的也是由js处理。

问题是我在启动eventlet服务器后无法发出任何事件。 我尝试设置异步模式但它没有所需的结果。

到目前为止,这是我的代码:

import socketio
from flask import Flask, render_template
import eventlet

import sys

sio = socketio.Server(async_mode='eventlet')
app = Flask(__name__)

@sio.on('connect')
def connect(sid, environ):
    print('connect ', sid)
    sio.emit('channel', 'new connection')
    sys.stdout.flush()

@sio.on('mes')
def message(sid, data):
    print('message ', data)
    sys.stdout.flush()

app = socketio.Middleware(sio)

eventlet.wsgi.server(eventlet.listen(('', 8000)), app)

# create folder HERE and emit event which will be sent to browser

更新:

我开始使用以下代码中的线程: (使用这样的线程有问题吗?还是另一种更好的方法?)

import socketio
from flask import Flask, render_template
import eventlet

import sys
import thread
import time

sio = socketio.Server(async_mode='gevent')

@sio.on('connect')
def connect(sid, environ):
    print('connect ', sid)
    sio.emit('channel', 'new connection')
    sys.stdout.flush()

@sio.on('mes')
def message(sid, data):
   print('message ', data)
   sio.emit('channel', 'yeah')
   sys.stdout.flush()

from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
app = socketio.Middleware(sio)

def worker( threadName ):
   count = 1
   while count > 0:
      time.sleep(1)
      # trying to emit message HERE
      sio.emit('mes', 'foo ' + str(count))
      print "working " + str(count)
      sys.stdout.flush()
      count += 1

def server( threadName ):
   print "server starting"
   sys.stdout.flush()
   pywsgi.WSGIServer(('', 8000), app, handler_class=WebSocketHandler).serve_forever()

try:
   thread.start_new_thread( worker, ("Thread-1", ) )
   thread.start_new_thread( server, ("Thread-2", ) )
except:
   print "Error: unable to start thread"

while 1:
   pass

现在的问题是sio.emit('mes', 'foo ' + str(count))会发出消息 - 但浏览器每隔20~30秒才会捕获一次消息,然后处理所有丢失的事件。使用开发控制台中的帧查看图片。

network frames

1 个答案:

答案 0 :(得分:2)

根据@Miguel的评论,我完成了达到我的目标。

我删除了似乎具有所需效果的服务器的线程。现在,每次工作人员触发事件时,开发人员控制台都会显示一个发出的事件。

import socketio
import sys
import thread
import time

sio = socketio.Server(async_mode='gevent')

@sio.on('connect')
def connect(sid, environ):
    print('connect ', sid)
    sio.emit('channel', 'new connection')
    sys.stdout.flush()

@sio.on('mes')
def message(sid, data):
   print('message ', data)
   sio.emit('channel', 'yeah')
   sys.stdout.flush()

from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
app = socketio.Middleware(sio)

def worker( threadName ):
   count = 1
   while count > 0:
      time.sleep(5)
      sio.emit('mes', 'foo ' + str(count))
      print "working " + str(count)
      sys.stdout.flush()
      count += 1

try:
   thread.start_new_thread( worker, ("Thread-1", ) )
except:
   print "Error: unable to start thread"

print "server starting"
sys.stdout.flush()
pywsgi.WSGIServer(('', 8000), app, handler_class=WebSocketHandler).serve_forever()