Socket.io客户端无法与服务器连接

时间:2011-08-03 21:04:16

标签: node.js socket.io

几个星期前我开始阅读有关node.js的内容,并决定了解更多信息。我在我的Linux服务器(Turnkey Linux,基本上是Ubuntu)上安装了node和socket.io以及一些其他软件包(express和一些我不记得的)。我找到了一些教程并经历了这些教程,并且无法让任何客户端将消息发送回服务器。以下是我经历过的一些教程(我有更多,但该网站不允许我发布更多链接):

简单的聊天室 http://vivahate.com/2011/03/25/a-simple-chat-room-in-node-js/

简单的Socket.io实时聊天 http://webdevrefinery.com/forums/topic/7991-simple-socketio-real-time-chat/

请注意,webdevrefinery在网络上有一个现场演示,可以在我的浏览器中使用2台不同的计算机。我下载并运行了代码链接,服务器运行正常。我转到网址(我的局域网上为192.168.0.30:3000),当我浏览到URL时,它显示正确的HTML和控制台输出“debug - served static /socket.io.js”。当我输入信息并且“输入”时没有任何反应。我将警报放入代码中,似乎在“sendMsg()”中的“socket.send”行上失败了。这是我正在使用的代码:

server.js:

    var http = require('http'),
    sys = require('sys'),
    fs = require('fs'),
    io = require('socket.io');

var server = http.createServer(function(req, res) {
    fs.readFile('chat.html', 'binary', function(err, data) {
        if( err ) {
            res.writeHead(500, {'Content-type': 'text/html'});
            res.write(data + "\n");
            res.end();
            return;
        }

        res.writeHead(200, {'Content-type': 'text/html'});
        res.write(data, 'binary');
        res.end();
    });
});
server.listen(3000);

var socket = io.listen(server);
socket.on('connection', function( client ) {
    client.on('message', function(data) {
        console.log("Message: " + JSON.stringify(data));
        socket.broadcast(data);
    });
    client.on('disconnect', function() {
    });
});

client.html

<html>
<head>
<style type="text/css">
#msgs {
    height: 50%;
    overflow-y: scroll;
}

div.odd {
    background-color: gray;
}
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript" src="http://192.168.0.30:3000/socket.io/socket.io.js"></script>
<title>Realtime Chat Test</title>
</head>
<body>
<div id="container">
<div id="msgs"></div>
<div id="form">
<form id="chat" action="javascript:sendMsg()">
Username:<input type="text" name="username" /><br />

Message:<input id="msg" type="text" name="message" /><br />
<input type="submit" />
</form>
</div>
</div>
</body>
<script type="text/javascript">
var socket = new io.Socket("192.168.0.30", {port:3000});
socket.connect();

var classes = new Array('even', 'odd');
var numMsgs = 0;

function reconnect() {
    if( socket.connecting ) {
        setTimeout('reconnect()',1000);
    }
    else if( !socket.connected ) {
        socket.connect();
        setTimeout('reconnect()',1000);
    }
}

socket.on('disconnect', function() {
    reconnect();
});

socket.on('message', function(data) {
    var ms = JSON.parse(data);
    if( ms.username !== undefined && ms.message !== undefined ) {
        numMsgs++;
        $('#msgs').append( function() {
            var d = $('<div class="'+classes[numMsgs%2]+'"/>');
            d.text(ms.username + ' says: ' + ms.message);
            return d;
        });
        var objDiv = document.getElementById('msgs');
        objDiv.scrollTop = objDiv.scrollHeight;
    }
}); 

function sendMsg() {
    var values = {};
    $.each($('#chat').serializeArray(), function(i,v) {
        values[v.name] = v.value;
    });
    document.getElementById("msg").value = "";
    socket.send(JSON.stringify(values));
}
</script>
</html>

我正在使用的Linux的发行版没有X或类似的东西,因为我从Windows机器上浏览所有内容,这就是为什么我没有从localhost进行测试,尽管我认为这应该起作用正在提供的HTML证明的其他主机以及当我浏览页面时输出的消息。关于为什么我从来没有从客户端收到任何消息到服务器的任何想法?我假设我在每个教程中都犯了同样的错误,因为我已经尝试了大约8个其他教程,但我总是遇到同样的问题。感谢。

的Darryl

2 个答案:

答案 0 :(得分:1)

这是对阿尔弗雷德回答后的评论的回应。我无法弄清楚如何在该行中添加另一条评论,所以我发布了一个“答案”。

@Alfred - 感谢这个例子,但是看起来确实很多,因为丹尼尔认为我没有得到一个简单的信息。 @Daniel - 就文档而言,我仍然不知道如何在socket.io主页上实际使用该示例。有一个“如何使用”链接什么都不做,而且一个Wiki链接没有解释这些例子的任何内容。我知道如何启动服务器,但仍然不知道如何将客户端连接到服务器,甚至不知道如何“启动”客户端。大多数教程都有某种“链接代码”指向服务器的客户端页面,然后您只需将浏览器指向“http:// yoursiteaddress:port”并显示该页面。 socket.io主页上的代码在客户端和服务器代码之间没有这样的“连接”。您是否应该浏览“客户端”代码?我尝试了它,它提供完全相同的代码,无论我去哪个URL假设我要去“http:// yoursiteaddress:port”这是有道理的,但我还没有看到任何文档实际解释如何使用它码。因此,我去的教程显然都使用旧代码。是否有一些我遗漏的文件?

答案 1 :(得分:0)

我打赌你的问题在于你的依赖。让我们看一下我的依赖关系,例如:

$ npm ls

├─┬ express@2.4.3 
│ ├─┬ connect@1.6.0 
│ │ └── qs@0.3.0 
│ ├── mime@1.2.2 
│ └── qs@0.3.0 
├─┬ socket.io@0.7.7 
│ ├── bison@1.1.1  extraneous
│ ├── policyfile@0.0.3 
│ ├── redis@0.6.0 
│ └─┬ socket.io-client@0.7.4 
│   └── uglify-js@1.0.3

从socket.io 0.6.x到0.7.x,API经历了一些重大变化。看起来您正在使用socket.io 0.6.x阅读旧教程,并且已安装0.7.x.我建议你阅读migration instructions

我想为您提供真正简单的演示(使用已安装的快递),希望它能够正常工作。

var app = require('express').createServer(),
    sio = require('socket.io');

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script>\
<script>\
  var socket = io.connect("http://192.168.0.30");\
  socket.on("news", function (data) {\
    alert(data.hello);\
  });\
</script>');
});

app.listen(3000);

var io = sio.listen(app);

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
});

连接到socket.io服务器时应该警告world


我还认为您的示例可以使用的是安装socket.io 0.6.18,这是目前位于文件夹node_modules内的最新0.6.x。由于node.js module system,Node.js将在本地包含该模块。您可以通过创建该目录来执行此操作(如果该目录尚不存在,则发出mkdir -p node_modules。接下来安装socket.io发布npm install socket.io@0.6.18。然后我认为你应该能够运行这些旧例子。