0

我无法使用 Guillermo Rauch 在本地和 cloud9 平台上的一个非常基本的 socket.io 聊天示例(只是对它的初步测试)在我的机器上运行 socket.io。我已经尝试将 socket.io 与 express 2.5.x 和 express 3 结合使用(相应地更改服务器代码)并使用 Nodeclipse 和命令行运行获得相同的行为:

信息:socket.io 启动
了在端口 3000 上运行 @ localhost 的 Socket 服务器

当我访问时,localhost:3000我得到:

调试:提供静态内容 /socket.io

没有握手,也许客户端没有连接。
也许这个问题很容易看出,但我在这里和其他地方都找不到适合我的情况的答案。这是我的环境:

Windows 7 x86 或 Windows 8 64 位;最新稳定节点上的 Nodeclipse(如果我没记错的话,是 0.10.15);使用过:google chrome、firefox、IE 最新;

还尝试通过 WAMP 服务器提供索引页面;

尝试了很多替代方案,这似乎表明这不是代码问题,而是属于其他问题(表示与最新的节点安装不兼容?环境变量有问题吗?);

express 似乎服务于 /socket.io/socket.io.js 文件,因为当我输入 localhost:3000/socket.io/socket.io.js 时,它可以通过任何浏览器读取(我不知道这是否正确测试)。

这是客户端代码:

<!doctype html>
<html>
<head>
    <title>my test</title>
    <script src="/socket.io/socket.io.js"></script>
    <script src="chat.js">
    <link href="/stylesheets/style.css" rel="stylesheet" />
</head>
<body>
    <div id="chat">
        <ul id="messages"></ul>
        <form id="form">
            <input type="text" id="input" />
            <button>Send</button>
        </form>
    </div> 
</body>
</html>

这是服务器端应用程序:

var express = require('express');
var sio = require('socket.io');
var app = express.createServer(
        express.bodyParser(),
        express.static('public'));
app.listen(3000);

var io = sio.listen(app);

console.log('Socket server running @ localhost on port ' + 3000);

io.sockets.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
    console.log('hello');
    });
});

chat.js 包含:

window.onload = function() {
    var socket = io.connect("http://localhost:3000");
    socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
};

这些是 socket.io 和 express 的版本,通过从 nodeclipse 工作区文件夹 (c:/users/myname/workspace/nameoftheapp) 给出的 npm install 命令在本地安装(express 也全局安装)“express”:“2.5.4 ", "socket.io": "0.9.16"

项目结构

node_modules  
|- [...] (all the installed folders and files]  
public  
|- stylesheets  
--|-style.css  
|- index.html  
app.js  
package.json  
readme.md  

我是否必须在连接中设置某些内容才能正确指向我的工作区?

4

2 回答 2

0

我在试图弄清楚如何在Cloud9上使用 socket.io 时遇到了这个问题。我不知道Cloud9如何影响您的问题(尽管在您的标题中提到了),但对我来说,我无法与客户端建立握手,并且只能在Cloud9终端中收到一条debug: served static content消息。我最终发现是客户端中的连接链接导致了问题。使用 socket.io 设置 Express 也并不容易,因为您可能会像 Peter 所说的那样混淆不同的变量。

服务器代码:

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

server.listen(process.env.PORT || 3000, function() {
    console.log('Express server started on port %s', process.env.PORT);
});

io.sockets.on('connection', function(socket) {
    socket.emit('news', {
        hello: 'world'
    });
    socket.on('my other event', function(data) {
        console.log(data);
    });
});

客户代码:

<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect(window.location.hostname);
    socket.on('news', function(data) {
        console.log(data);
        socket.emit('my other event', {
            my: 'data'
        });
    });
</script>

我使用window.location.hostname了该脚本,以便该脚本既可以在Cloud9测试服务器上运行,也可以在我部署我的应用程序的任何地方运行(在我的例子中是Heroku)。

Express 3.2.6和一起使用Socket.io 0.9.13

于 2013-10-23T18:35:44.143 回答
0

您需要使用http.createServer而不是express.createServer

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

server.listen(3000, function () {
  console.log("listening on port 3000");
});
于 2013-08-08T14:05:32.850 回答