0

我编写了一个 Node.js socket.io 例程,该例程将由我的树莓派中的 python 套接字 io 例程调用。它将双向通信。目前,当我在 localhost 上运行这两个例程时,它工作正常。但是,当我将服务器应用程序部署到 cloudfoundry 并将 SocketIO 连接链接更改为 cloudfoundry 时,它不起作用。下面是客户端python

from socketIO_client import SocketIO

def on_updatepi_response(*args):
    print 'updatepi'

def on_receivepi_response(*args):
    print 'receiveepi'    

with SocketIO('raspinode-server.cloudfoundry.com', 8080) as socketIO:
    socketIO.on('receivepi', on_receivepi_response)
    socketIO.on('updatepi', on_updatepi_response)
    socketIO.emit('sendrabbit','testdata')
    socketIO.wait(seconds=1)

我知道 cloudfoundry 可能有点奇怪,因为我的第一个想法是使用 rabbitmq,但它与 VCAP_SERVICES 想法相关。但是,我认为 Node.js 页面上不会有这样的限制。

让我知道上面的代码是否有问题,如果没有,我怎样才能让我的外部 pi 将读数发送到我的云应用程序?

下面列出了服务器代码,尽管它不相关。它在 localhost 上响应...我知道 rabbitmq 代码尚未连接

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var amqp = require('amqp');
var io = require('socket.io').listen(server)

function rabbitUrl() {
    if (process.env.VCAP_SERVICES) {
        conf = JSON.parse(process.env.VCAP_SERVICES);
        return conf['rabbitmq-2.4'][0].credentials.url;
    }
    else {
        return "amqp://localhost";
    }
}

var port = process.env.VCAP_APP_PORT || 3000;

var messages = [];

function setup() {
    var exchange = conn.exchange('cf-demo', {'type':'fanout', durable:false}, function(){
        var queue = conn.queue('', {durable:false, exclusive:true},

            function() {
                queue.subscribe(function(msg) {
                    messages.push(htmlEscape(msg.body));
                    if (messages.length > 10) {
                        messages.shift();
                    }
                });
                queue.bind(exchange.name, '');
            }); 
            queue.on('queueBindOk', function() {httpServer(exchange);});
    });
}


server.listen(8080);

io.sockets.on('connection', function(socket){
    // when the client emits sendrabbit, this listens
    socket.on('sendrabbit', function(data)
    {

        // we tell the client to execute updatepi with 2 parameters
        io.sockets.emit('updatepi', socket.username, data)
    });

    socket.on('disconnect', function()
    {
        socket.broadcast.emit('updatepi', 'SERVER', socket.username + ' has disconnected');
    });

});
4

1 回答 1

1

据我了解,您的服务器应该侦听 Cloud Foundry 为其分配的端口(在 env var 中可用)。您不能假设它将是 8080。然后客户端与 raspinode-server.cloudfoundry.com(无端口)对话,Cloud Foundry 将其路由到正确的位置。

于 2013-06-22T20:09:08.860 回答