有没有人有经验让Node.js和socket.io在Cloud9 IDE上工作?
“示例(带有Socket.io的NodeJS)”(位于https://c9.io/site/blog/2013/05/native-websockets-support/)不起作用。
首先,服务器(https://c9.io/etlolap/webapp,/ test.js)抛出错误,除非我修复如下。当test.js处于活动选项卡时,我单击了Run按钮。
var
socketIo = require('socket.io'),
io = socketIo.listen(Number(process.env.PORT));
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
然后,我的客户端(https://c9.io/etlolap/webapp,/ test.html)仍然无法连接。当test.html处于活动选项卡时,我点击了预览按钮。
<!doctype html>
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('https://webapp-c9-etlolap.c9.io');
socket.on('news', function (data) {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
</head>
<body>
Loading...
</body>
</html>
并在下面收到错误消息。
无法加载资源:服务器响应状态为404 ---(未找到)https://c9.io/socket.io/socket.io.js
未捕获的ReferenceError:io未定义--- test.html:6
答案 0 :(得分:10)
<强> 1。步骤强>
1.1)Run
server.js
云9控制台显示:
1.2)在index.html上点击Preview
1.3)然后在IDE的右侧打开一个窗口。您可以点击导航栏中间的按钮,也可以将网址复制并粘贴到新的浏览器窗口中。
1.4)套接字通信正在运行!
<强> 2。先决条件强>
2.1)节点模块socket.io
点击F6
或View -> Console
并安装socket.io。
2.2)来自socket.io的客户端JavaScript
由于我没有找到下载它的官方链接,我创建了一个GitHubGist。
第3。代码强>
<强> server.js 强>
// module dependencies
var http = require("http"),
sio = require("socket.io");
// create http server
var server = http.createServer().listen(process.env.PORT, process.env.IP),
// create socket server
io = sio.listen(server);
// set socket.io debugging
io.set('log level', 1);
io.sockets.on('connection', function (socket) {
socket.emit('news', { message: 'Hello world!' });
socket.on('my other event', function (data) {
console.log(data.message);
});
});
的的index.html 强>
<!DOCTYPE html>
<html>
<script src="js/socket.io.js"></script>
<script>
var socket = io.connect("https://demo-project-c9-matthiasholdorf.c9.io");
socket.on("news", function(data) {
console.log(data.message);
});
socket.emit("my other event", { message : "client emit" } );
</script>
</html>
答案 1 :(得分:2)
感谢wethat和马蒂亚斯的反馈。经过多次尝试失败后,我终于找到了解决方案。 在Cloud9 IDE上,客户端中的典型行(此处为test.html)必须从
更改 <script src="/socket.io/socket.io.js"></script>
到
<script src="https://webapp-c9-etlolap.c9.io/socket.io/socket.io.js"></script>
前缀是您的Cloud9项目网址的网址。通过更改此行,我的示例有效。
答案 2 :(得分:0)
你必须顺利完成这些步骤:
在https://c9.io/etlolap/webapp上打开终端,输入:
npm install socket.io
node test
然后用url打开一个新的浏览器标签
https://webapp-c9-etlolap.c9.io/socket.io/socket.io.js
您将看到socket.io.js源代码
我没有在没有http服务器的情况下如何在c9.io中打开test.html,你只是按预览吗?
编辑:
要返回html文件,您应该合并http server和socket.io服务器,如下所示:
// file: test.js
var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
app.listen( Number( process.env.PORT ) );
function handler (req, res) {
fs.readFile(__dirname + '/test.html',
function (err, data) {
if (err) {
res.writeHead(500);
return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
答案 3 :(得分:0)
要使用位于文件夹中的html文件获取所请求的任何html文件,您可以使用express:
var fs = require('fs');
var express = require('express');
var app = express();
// This fetches html files from the client folder (if they exist), and returns a "Page could not be found" error otherwise (this can be customized to some other 404 error page as desired)
app.get('*', function (req, res) {
var urlReading = req.url;
if (urlReading == "/")
{
urlReading = "/index.html";
}
urlReading = __dirname + "/client" + urlReading;
console.log("Loading: " + urlReading);
fs.readFile(urlReading, function (err, html) {
if (err) {
console.log("Could not find " + urlReading)
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end("<html><head><title>Page could not be found</title></head><body><h1>Page could not be found</h1></body></html>");
}
else
{
console.log("Found " + urlReading)
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(html);
}
});
});
app.listen(process.env.PORT, process.env.IP);