求教:nodejs和socket.io很基础的问题
发布于 3年前 作者 node2000 2301 次浏览

最近开始接触socket.io这个模块,出了点问题,老手帮忙看下,我找不出原因来: windowXP 32位 服务器端:

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

server = http.createServer().listen(8888);
var socketserver = io.listen(server);

server.on('request',function(req,res){
    fs.readFile(__dirname+'/client.html',function(err,data){
        if(err){
            res.writeHead(500,{});
            res.end("cannot connect");
        }
        res.writeHead(200,{'content-type':'text/html'});
        res.end(data);
    });
});

socketserver.on('connection',function(socket){
    socket.emit('news',{'name':'lily'});
    console.log('client connected');
});

客户端(client.html):

<!DOCTYPE html>
<html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
    <script>
        $(document).ready(function(){
            var socket = io.connect("http://localhost:8888");
            socket.on('news',function(data){
                $('#info').html(data.name);
            });
        });
        //document.write('text2 here');
    </script>
<body>
<label id="info"></label>
text1 here
    

</body>
</html>

然后我启动服务器,控制台显示【info socket.io started】 打开浏览器(火狐、google),键入http://127.0.0.1:8888,却显示不出来“lily”,而且服务器端 也没有“client connected”字符串显示。这是不是意味着没有建立socket连接,为什么呢?? f5刷新一遍,倒是建立了链接。难道每次都要刷新下才能建立连接?

11 回复

这个问题和http://stackoverflow.com/questions/6770490/socket-io-basic-example-not-working 这个问题是一样的,没找到答案。。。你们都没碰到过?

Linux 下正常的, 真蛋疼… 打开网页直接显示: lily text1 here 浏览器的控制台里面有没有什么报错的?

问题搞出来了,创建server的时候直接使用回调和以后创建回调是不一样的

@node2000 没看懂其实… 看代码好像没问题的

@node2000 表示还没看懂啥意思~

@node2000 表示在Windows下运行该代码也没问题

用chrome的console调试发现,第一次访问localhost:8888时有报错:io is not defined;说明第一次访问的时候,socket.io.js并没有被加载出来,原因是当浏览器在请求/socket.io/socket.io.js的时候,通过的是你写的server.on('request’, function(){}),所以浏览器得到的是你返回给他的那段html

所以你只需要在你的server.on代码中判断一下,不处理对/socket.io/socket.io.js的请求就可以了~ 不知道我讲清楚了木有 :)

@iAnho 代码和官方的步骤对比, 难道就因为 .listen 写太早了吗?

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(80);

function handler (req, res) {
}

io.sockets.on('connection', function (
});

@jiyinyiyong 准备看看源码,但是我想这样分析应该没错: socket.io在监听server的时候会修改其对request请求事件的回调函数,将对/socket.io的请求去除,但如果在socket.io监听了server之后再绑定回调函数,那server就还是会处理/socket.io的请求 经简单测试可以验证

有试一下 将这段代码放在 on(‘connect’) 里面吗 socket.on('news’,function(data){ $(‘#info’).html(data.name); });

回到顶部