最近开始接触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刷新一遍,倒是建立了链接。难道每次都要刷新下才能建立连接?
这个问题和http://stackoverflow.com/questions/6770490/socket-io-basic-example-not-working 这个问题是一样的,没找到答案。。。你们都没碰到过?
问题搞出来了,创建server的时候直接使用回调和以后创建回调是不一样的
@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的请求就可以了~ 不知道我讲清楚了木有 :)
@jiyinyiyong 准备看看源码,但是我想这样分析应该没错: socket.io在监听server的时候会修改其对request请求事件的回调函数,将对/socket.io的请求去除,但如果在socket.io监听了server之后再绑定回调函数,那server就还是会处理/socket.io的请求 经简单测试可以验证