2012-09-13 188 views
1

我想使用Socket.IO來允許我的Node.JS應用程序與Python後端進行通信。我希望Node.JS充當客戶端和Python充當服務器,所以除了gevent-socketio python模塊之外,我還使用了socket.io-client Node.JS模塊。node.js socket.io客戶端+ python socketio

https://github.com/LearnBoost/socket.io-client https://github.com/abourget/gevent-socketio

這裏是我的Python服務器:

#!/usr/bin/env python 
from socketio.server import SocketIOServer 
from socketio.namespace import BaseNamespace 

class MyNamespace(BaseNamespace): 
    def on_foobar(self,data): 
     print 'received method for foobar' 
     print data 


server = SocketIOServer(('localhost', 1234),resource=MyNamespace,policy_server=False) 
print 'SocketIO server listening...' 
server.serve_forever() 

,這裏是我的Node.js服務器(作爲客戶端):

#!/usr/bin/env node 
var io = require('socket.io-client'); 
var PySocket = io.connect('localhost:1234'); 
PySocket.emit('foobar',{'key1':'value1'}); 

由於某些原因,python服務器沒有看到連接。任何人都可以指出我錯過了什麼?

回答

1

您需要在Python方面多一點。

Namespace對象不能作爲參數傳遞給SocketIOServer對象。 resource(後來重命名爲namespace)只是要識別的路徑的名稱(如http:// localhost/[namespace]/[其餘的socket.io協議路徑]。我同意術語中存在重疊,但我們很少處理除socket.io以外的資源/名稱空間

現在,爲了讓您的python IO服務器能夠運行,您需要使用一些框架來包裝它..以實際地將一些傳入請求分派給正確的處理程序。該處理程序必須執行socketio_manage(),這是你應該傳遞Namespace對象作爲參數的函數。另外,你的框架可能需要服務其他文件,比如.swf ... gevent-socketio不會這樣做另外,如果你想讓你的python進程做任何事情(比如與數據庫交互,加載一些配置文件),我推薦你pi這是一個框架,因爲它會減輕你的生活,主要是你需要做的任何事情。

如果你真的只想要一個socket類型的服務器,從node.js到python,那麼爲什麼不使用標準的TCP/UDP套接字?在這種情況下,您不需要框架的開銷,Socket.IO協議的編碼/解碼等。

您的特定用例是什麼?也許這可能會讓我們看到前進的道路。

+0

特殊用例= node.js和python之間的基本通信。我不需要提供.swf或任何其他類型的內容,所以我認爲我不需要框架。 – ejang

+0

TCP/UDP有點煩人,因爲我必須跟蹤緩衝區大小等。有更簡單的套接字庫嗎? – ejang

+0

此外,socket.io emit()函數非常有用,因爲我可以指定python可以專門響應而不必從數據中解析出特定標誌的方法。我認爲用普通套接字是不可能的,除非我在多個端口上建立連接,這很煩人 – ejang