2016-08-30 1 views
0

Ich brauche ein bisschen Hilfe.Emit socket.io Nachricht mit Python mit Nodejs als Server

Ich mache Tests, um zu lernen, wie man ein Echtzeit-Web erstellt, also verwende ich node.js mit socket.io. Alles funktioniert lustig, aber wenn ich versuche, eine Nachricht in dem Kanal zu veröffentlichen, der Knoten mit einer anderen Quelle hostet, die kein Knoten oder Javascript ist, stürzt es ab.

Server-Seite: (Knoten, schlägt fehl, wenn eine externe veröffentlichen sended ist)

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'); 
}); 

Sie brauchen nicht den clientseitigen Code für versuchen, nur diesen Code setzen und es mit Knoten ausgeführt werden. Wenn es läuft, versuche, auf dem Kanal mit Redis direkt zu veröffentlichen und zu sehen, was passiert.

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 

Jemand versteht, warum dies geschieht? Wie kann ich es reparieren?

Vielen Dank!

NEUER KOMMENTAR: Dank robertklep weiß ich, dass es das gleiche Protokoll verwenden muss, also schrieb ich ein einfaches Python-Skript, das es verwendet, aber es schlägt mit demselben Fehler fehl.

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) 

ich auch diesen Ansatz versucht, ich denke Im etwas param falsch vorbei:

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!") 

In diesem Fall nichts zu Redis kommt.

Antwort

0

socket.io-redis verwendet msgpack oben auf Redis zu pub/sub-Nachrichten, so dass Sie nicht einfach reguläre Zeichenfolgen drücken und erwarten, dass es funktioniert. Der Client, den Sie verwenden, muss dasselbe Protokoll verwenden.

+0

Vielen Dank für diese Information Robertklep. Ich erstelle ein neues Skript mit Python mit msgpack über Redis, aber es behebt das Problem nicht. Ich habe den gleichen Fehler: "Fehler: 23 nachlaufende Bytes". – user2742735

Verwandte Themen