2012-10-23 18 views
7

Tôi đang cố gắng xây dựng một ứng dụng nhỏ trong các nút bấm để xuất bản và đăng ký. Tôi bị mắc kẹt trong cách tôi có thể xuất bản từ phía khách hàng. Đây là mã tôi có.Nodejs Xuất bản từ Khách hàng trong pub/sub

Đây là mã máy chủ của tôi (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); 
    }); 
}); 

Và đây là mã khách hàng

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

Vui lòng giúp chúng tôi giúp bạn bằng cách thêm một số giải thích và/hoặc nhận xét về mã của bạn, đặc biệt là trên các chức năng gọi lại ổ cắm phía máy khách của bạn. Bạn muốn khách hàng của mình xuất bản dữ liệu ở đâu và theo cách nào? – matthias

+0

Có vẻ như bạn đang cố sử dụng tuyến đường 'POST' để cho phép khách hàng xuất bản một sự kiện; đúng không? – floatingLomas

Trả lời

4

Bạn có thể sử dụng phương pháp emit trên cả các kết nối máy chủ WebSocket, lấy khách hàng và từ Socket.io:

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

Sau đó trên máy chủ của bạn, bạn nghe f hoặc thông điệp:

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

Bằng cách này bạn đang sử dụng các thông tin liên lạc hai chiều của WebSockets mà không cần phải sử dụng một số POST api.

Các vấn đề liên quan