2016-08-30 12 views
0

私は少しの助けが必要です。nodejsをサーバとして使用してPythonでsocket.ioメッセージを送信

私はリアルタイムWebを構築する方法を学ぶためのテストをしているので、socket.ioでnode.jsを使用します。すべてが楽しいですが、ノードまたはJavaScriptではない別のソースでリッスンしているチャンネルにメッセージを公開しようとするとクラッシュします。

サーバー側:(外部に公開するときに失敗したノードsendedではれる)

var app = require('express')(); 
var http = require('http').Server(app); 

var pub = require('redis').createClient(6379, 'localhost', {detect_buffers: true, return_buffers: false}); 
var sub = require('redis').createClient(6379, 'localhost', {return_buffers: true}); 

var io = require('socket.io')(http); 

var redis = require('socket.io-redis'); 
io.adapter(redis({pubClient: pub, subClient: sub, host: '127.0.0.1', port: 6379})); 


io.on('connection', function(socket){ 
    socket.on('chat message', function(msg){ 
    io.emit('chat message', msg); 
    console.log("something happens: " + msg); 
    }); 
}); 


http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 

あなたはこのコードを入れて、ノードとそれを実行し、それを試しため、クライアント側のコードは必要ありません。実行中の場合は、Redisのチャンネルに直接公開し、何が起こっているかを確認してください。

Error: 5 trailing bytes 
    at Object.decode (.../node/node_modules/msgpack-js-v5/msgpack.js:266:47) 
    at Redis.onmessage (.../node/node_modules/socket.io-redis/index.js:93:24) 
    at emitTwo (events.js:87:13) 
    at RedisClient.emit (events.js:172:7) 
    at RedisClient.return_reply (.../node/node_modules/redis/index.js:654:22) 
    at .../node/node_modules/redis/index.js:307:18 
    at nextTickCallbackWith0Args (node.js:419:9) 
    at process._tickCallback (node.js:348:13) 
    enter code here 

これはどうして起こるのですか?どうすれば修正できますか?

ありがとうございました!

NEW COMMENT: robertklepのおかげで、同じプロトコルを使用する必要があることがわかりました。そのため、単純なPythonスクリプトを使って書きましたが、同じエラーで失敗します。

import redis 
import msgpack 
text_packed = msgpack.packb('refresh', use_bin_type=True) 
r = redis.StrictRedis(host='localhost', port=6379, db=0) 
r.publish('socket.io#/#', text_packed) 

私もこのアプローチを試みたが、私はImは、いくつかのparam間違って渡し思う:この場合

from emitter import Emitter 
io = Emitter(dict(host='localhost', port=6379)) 
io.Emit('chat message', "message from python!") 
# or specificating the room 
io.To("socket.io#/#").Emit('chat message', "message from python!") 

を、何もRedisのために到着していません。

答えて

0

socket.io-redisは、メッセージをpub/subするためにRedisの上にmsgpackを使用するため、通常の文字列をプッシュして動作させることはできません。使用しているクライアントは、同じプロトコルを使用している必要があります。

+0

その情報をありがとうRobertklep。私は、redisを通してmsgpackを使用してPythonで新しいスクリプトを作成しますが、問題は解決しません。 私は同じエラーがあります: "エラー:後続バイト23"。 – user2742735

関連する問題