2016-05-13 5 views
2

私は、Webプロジェクトをphpとpythonスクリプトを使ってフォルダを修正しています。 私は、例えば、ウェブサイト上でいくつかのjavascriptを実行したいと思います。 pythonスクリプトでフォルダを作成します。サーバの作成後にPython SocketIOイベントが発生する

私の考えは、python socketioで作業することでした。私は、基本的な接続通知が働いていて、ウェブサイト上のjsからも放出されています。

問題は、イベントレットサーバーの起動後にイベントを発行できないことです。 非同期モードを設定しようとしましたが、目的の結果がありません。ここで

は、これまでの私のコードです:

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 

はUPDATE:そのようなスレッドを使用するに問題があります( または:

私は、次のコードのようにスレッドを使用して開始しました?別のより良いアプローチ?)

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 

今問題は01ですがメッセージを送信しますが、ブラウザは20〜30秒ごとにそれをキャッチし、欠落しているすべてのイベントが処理されます。デベロッパーコンソールのフレームの画像を参照してください。私は私が目指していた目標に到達するためになさ@Miguelのコメントで

network frames

+0

わかりません。サーバーを起動した直後にコードを実行しようとしていますか?これで、どのように動作するのか、サーバー作成呼び出しは返されません。 – Miguel

+0

@Miguelはい、私がやろうとしていたことです。スレッドを使用して新しいコードで質問を更新しました - そのようなスレッドを使用するのは正しいですか?そして、新しい出来事がなぜすぐに取り上げられるのか知っていますか? – rambii

+0

サーバーをバックグラウンドスレッドに置く必要はありません。メインスレッドでサーバーを起動する前に、ワーカースレッドを開始するだけです。それ以外に、私が考えることができるのは 'time.sleep()'の代わりに 'gevent.sleep()'を使うべきだということです。 – Miguel

答えて

2

希望の効果があると思われるサーバーのスレッドを削除しました。開発者コンソールは、ワーカーがイベントを発生させるたびに放出イベントを表示します。

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() 
関連する問題