Nodejs websocket-node 模块发布在appfog上的问题
Nodejs websocket-node 模块发布在appfog上的问题
我用websocket模块,在本地测试没用问题,发布到 appfog 后为什么建立不起ws 连接?
Nodejs websocket-node 模块发布在AppFog上的问题
问题描述
我在本地使用 websocket-node
模块进行WebSocket通信时一切正常,但将应用部署到AppFog后,客户端无法与服务器建立WebSocket连接。
可能的原因
- 端口配置问题:AppFog可能需要特定的端口配置来支持WebSocket。
- 安全策略:AppFog的安全策略可能会阻止某些端口或协议。
- 域名解析问题:部署到AppFog后,域名解析可能存在问题。
- 环境变量配置: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.');
});
});
关键点解释
- 监听端口:使用
process.env.VCAP_APP_PORT
来获取AppFog分配的端口号。 - 自动接受连接:设置
autoAcceptConnections
为false
,以便你可以手动处理连接请求。 - 允许所有来源:在
originIsAllowed
函数中返回true
,以允许所有来源。你也可以根据实际情况进行限制。 - 处理消息:当接收到消息时,服务器会将消息回传给客户端。
总结
通过上述步骤,你应该能够解决在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连接问题,通常是由于以下几个原因:
-
端口绑定:AppFog要求你的应用监听指定的环境变量
PORT
。你需要确保WebSocket服务器监听的是正确的端口。 -
域名和路径:在AppFog上运行时,WebSocket的URL可能会包含不同的域名和路径。确保客户端和服务端的URL配置一致。
-
防火墙和安全组设置:检查是否有任何防火墙或安全组规则阻止了特定端口的访问。
示例代码
假设你已经安装了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功能。