2012-10-23 19 views
7

Próbuję zbudować małą aplikację w nodejs, aby opublikować i subskrybować. Utknąłem w tym, jak mogę publikować od strony klienta. Oto kod, który mam.Nodejs Publikuj od klienta pub/sub

Oto mój kod serwera (server.js)

var express = require('express'), 
app = express(), 
http = require('http'), 
server = http.createServer(app); 
app.use(express.bodyParser()); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/public/index.html'); 
}); 

app.post('/publish/:channel/:event/', function(req, res) { 
    console.log("**************************************"); 
    var params = req.params; 
    console.log(req.params); 
    console.log(req.body); 
    var data = req.body; 
    console.log("**************************************"); 
    var result = io.sockets.emit(params.channel,{event:params.event,data:data}); 
    //console.log(result); 
    console.log("**************************************"); 
    res.sendfile(__dirname + '/public/index.html'); 
}); 

//include static files 
app.use(express.static(__dirname + '/public')); 

server = server.listen(3000); 
var io = require('socket.io').listen(server); 

io.sockets.on('connection', function (s) { 
    socket = s 
    socket.emit('c1', { hello: 'world' }); 

    socket.on('test', function (data) { 
    socket.emit('c1', { hello: 'world' }); 
    console.log('test');console.log(data); 
    }); 
}); 

A oto kod klienta

var narad = {}; 
narad.url = 'http://192.168.0.46:3000'; 

narad.lisentingChannels = {} 

var socket = io.connect(narad.url); 

function Channel(channelName) { 
    this.channelName = channelName; //serviceObject is the object of 
    this.events = {}; 
}; 

Channel.prototype.bind = function (event, callback) { 
    this.events[event] = callback; 
}; 

narad.subscribe = function (channelName) { 
    var channel = new Channel(channelName) 
    this.lisentingChannels[channelName] = channel; 

    socket.on(channelName, this.callbackBuilder(channel)) 

    return this.lisentingChannels[channelName]; 
} 

narad.callbackBuilder = function (channel) { 
    return function (data) { 
    var callback = channel.events[data["event"]]; 
    callback(data.data); 
    } 
} 
+0

Pomóż nam pomóc, dodając kilka wyjaśnień i/lub komentarzy do Twojego kodu, szczególnie w sprawie funkcji zwrotnych gniazdka po stronie klienta. Gdzie i w jaki sposób chcesz, aby twój klient publikował dane? – matthias

+0

Wygląda na to, że próbujesz użyć trasy 'POST', aby umożliwić klientowi opublikowanie zdarzenia; czy to jest poprawne? – floatingLomas

Odpowiedz

4

Można użyć metody emit zarówno na kliencie i połączeń serwera websocket, podjęte od Socket.io:

var socket = io.connect(narad.url); 
socket.emit('publish', 'message'); 

Następnie na serwerze słuchasz f lub komunikat:

socket.on('publish', function (data) { 
    // Emit the published message to the subscribers 
    socket.emit('subscribers', data); 
    console.log(data); 
}); 

ten sposób używasz dwukierunkową komunikację WebSocket bez konieczności korzystania z niektórych POST API.

Powiązane problemy