Node.js和socket.io不适用于Cloud9 IDE

时间:2013-12-14 04:41:34

标签: node.js socket.io cloud9-ide

有没有人有经验让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

4 个答案:

答案 0 :(得分:10)

<强> 1。步骤

1.1)Run server.js

enter image description here

云9控制台显示:

enter image description here

1.2)在index.html上点击Preview

enter image description here

1.3)然后在IDE的右侧打开一个窗口。您可以点击导航栏中间的按钮,也可以将网址复制并粘贴到新的浏览器窗口中。

enter image description here

1.4)套接字通信正在运行!

enter image description here

enter image description here



<强> 2。先决条件

2.1)节点模块socket.io

点击F6View -> Console并安装socket.io。

enter image description here

2.2)来自socket.io的客户端JavaScript

由于我没有找到下载它的官方链接,我创建了一个GitHubGist。

socket.io.js



第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);