Nodejs websocket-node 模块发布在appfog上的问题

Nodejs websocket-node 模块发布在appfog上的问题

我用websocket模块,在本地测试没用问题,发布到 appfog 后为什么建立不起ws 连接?

9 回复

Nodejs websocket-node 模块发布在AppFog上的问题

问题描述

我在本地使用 websocket-node 模块进行WebSocket通信时一切正常,但将应用部署到AppFog后,客户端无法与服务器建立WebSocket连接。

可能的原因

  1. 端口配置问题:AppFog可能需要特定的端口配置来支持WebSocket。
  2. 安全策略:AppFog的安全策略可能会阻止某些端口或协议。
  3. 域名解析问题:部署到AppFog后,域名解析可能存在问题。
  4. 环境变量配置:AppFog环境中的某些配置可能与本地不同。

解决方案

首先,确保你的WebSocket服务器正确地监听了正确的端口。在AppFog上,你需要使用环境变量来获取正确的端口号。

示例代码
const WebSocket = require('websocket');
const http = require('http');

// 创建HTTP服务器
const server = http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello World!');
});

server.listen(process.env.VCAP_APP_PORT || 8000, () => {
    console.log(`Server is listening on port ${process.env.VCAP_APP_PORT || 8000}`);
});

// 创建WebSocket服务器
const wsServer = new WebSocket.server({
    httpServer: server,
    autoAcceptConnections: false // 需要手动接受连接
});

function originIsAllowed(origin) {
    return true; // 允许所有来源
}

wsServer.on('request', function(req) {
    if (!originIsAllowed(req.origin)) {
        req.reject();
        console.log((new Date()) + ' Connection from origin ' + req.origin + ' rejected.');
        return;
    }

    const connection = req.accept('echo-protocol', req.origin);
    console.log((new Date()) + ' Connection accepted.');
    
    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log('Received Message: ' + message.utf8Data);
            connection.sendUTF(message.utf8Data);
        }
    });

    connection.on('close', function(reasonCode, description) {
        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
    });
});

关键点解释

  1. 监听端口:使用 process.env.VCAP_APP_PORT 来获取AppFog分配的端口号。
  2. 自动接受连接:设置 autoAcceptConnectionsfalse,以便你可以手动处理连接请求。
  3. 允许所有来源:在 originIsAllowed 函数中返回 true,以允许所有来源。你也可以根据实际情况进行限制。
  4. 处理消息:当接收到消息时,服务器会将消息回传给客户端。

总结

通过上述步骤,你应该能够解决在AppFog上使用 websocket-node 模块时遇到的WebSocket连接问题。确保你的服务器配置正确,并且监听了正确的端口。如果问题仍然存在,请检查AppFog的日志和文档,以确认是否有其他特定的配置要求。


appfog目前并不支持websocket

是的 一开始我也找了好久可以支持socket.io的云环境 目前只找到一个:jitsu jitsu整个云环境都是用node写的 包括命令行工具也是node里面的一个包

支持的啊

现在支持socket.io这类websocket了?

这是我服务端的代码: var ser=http.createServer(function(request,response)
{ var pathName=url.parse(request.url).pathname;

logger.debug("Request for “+pathName+” received. "+ (++i)); route(handle, pathName, response, request); }).listen(4567);

soceketIO=socket_io.listen(ser);

//var host = ‘http://localhost:8080’; var host = ‘xxx.ap01.aws.af.cm’; var socket = io.connect(host);

我是就这样

你服务端的socket有没有什么特殊的设置呢

要在AppFog(现在称为Aliyun应用引擎)上使用websocket-node模块时遇到WS连接问题,通常是由于以下几个原因:

  1. 端口绑定:AppFog要求你的应用监听指定的环境变量PORT。你需要确保WebSocket服务器监听的是正确的端口。

  2. 域名和路径:在AppFog上运行时,WebSocket的URL可能会包含不同的域名和路径。确保客户端和服务端的URL配置一致。

  3. 防火墙和安全组设置:检查是否有任何防火墙或安全组规则阻止了特定端口的访问。

示例代码

假设你已经安装了websocket-node模块,以下是一个简单的示例来展示如何在AppFog上配置WebSocket服务器:

var WebSocketServer = require('websocket').server;
var http = require('http');

// 创建HTTP服务器
var server = http.createServer(function(request, response) {
    console.log((new Date()) + ' Received request for ' + request.url);
    response.writeHead(404);
    response.end();
});

server.listen(process.env.PORT || 3000, function() {
    console.log((new Date()) + ' Server is listening on port 3000');
});

// 创建WebSocket服务器
var wsServer = new WebSocketServer({
    httpServer: server,
    // 设置正确的路径
    path: '/mysocket'
});

wsServer.on('request', function(req) {
    var connection = req.accept(null, req.origin);
    console.log((new Date()) + ' Connection accepted.');

    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log('Received Message: ' + message.utf8Data);
            connection.sendUTF("I received your message: " + message.utf8Data);
        }
    });

    connection.on('close', function(reasonCode, description) {
        console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
    });
});

客户端代码

确保客户端也正确配置了WebSocket URL:

var socket = new WebSocket('ws://' + window.location.host + '/mysocket');

socket.onopen = function() {
    console.log('Connection established!');
};

socket.onmessage = function(msg) {
    console.log('Message from server:', msg.data);
};

注意事项

  • 确保process.env.PORT正确获取到分配给你的端口。
  • 配置WebSocket路径与服务端一致。
  • 检查AppFog上的安全设置和防火墙规则,确保没有阻拦WS连接所需的端口。

通过以上步骤和注意事项,你应该能够在AppFog上成功部署并使用WebSocket功能。

回到顶部