2012-04-09 63 views
4

我刚刚安装了这些nodejs和socket.io,但我在获取客户端连接到服务器时遇到了问题。NodeJS和Socket.io

在我的服务器我有:

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(3000, 'localhost'); 
console.log('Server running at http://localhost:3000/'); 

var io = require('socket.io').listen(3000); 

io.sockets.on('connection', function (socket) { 

    socket.emit('Hi.') ; 

}); 

而我的客户端上:

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('http://localhost:3000'); 

socket.on('connect', function() { 
    socket.emit('set nickname', confirm('What is your nickname?')); 
    socket.on('ready', function() { 
    console.log('Connected !'); 
    socket.emit('msg', confirm('What is your message?')); 
    }); 
}); 

我得到在Chrome中检查的一些误区:

GET http://localhost:9261/socket.io/socket.io.js 404 (Not Found) 
Uncaught ReferenceError: io is not defined 

回答

2

你是不是服务通过的NodeJS客户端脚本文件夹,这是不行的:

<script src="/socket.io/socket.io.js"></script> 

尝试使用这个:

<script src="http://localhost:3000/socket.io/socket.io.js"></script> 
+0

我已经尝试过了,我不再获得404,只是得到了require和io没有定义。 – imperium2335 2012-04-09 15:55:14

+0

你确定你已经安装了socket.io?你必须打开一个终端,转到与你的服务器相同的目录,然后使用Windows编写'npm install socket.io' – 2012-04-09 17:26:27

+0

即时通讯,我使用命令提示符将其安装在我当前的应用程序文件夹(即时通讯使用Dreamweaver)中,它安装了socket .io到一个名为node_modules的文件夹中,所以目录如下所示:F:\ xampp \ htdocs \ mySite \ node_modules \ socket.io – imperium2335 2012-04-09 19:23:42

2

看起来像你只向客户端结束'Hello World',而不是客户端代码的HTML。

服务器代码应该是这样的(从http://socket.io/#how-to-use):

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

app.listen(80); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.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); 
    }); 
}); 

你的客户端代码应该是index.html。另外,还要确保你有一个名为socket.io包含socket.io.js

+0

我已经经历了几次,但我似乎还没有得到它的工作。我现在有错误:未捕获的ReferenceError:需求未定义 未捕获的ReferenceError:io未定义 – imperium2335 2012-04-09 13:06:39

+0

“require is not defined” - 看起来像您在客户端使用require(这是错误的)。你如何运行服务器? – mihai 2012-04-09 13:13:42

+0

从命令提示符使用命令:node server.js,它运行正常,没有错误。 – imperium2335 2012-04-09 14:19:14

1

它无法连接,因为您的客户端无法找到socket.io.js 您可以使用来自node_modules \ socket.io \ node_modules \ socket.io-client \ dist目录的适当文件来解决使用套接字。 io.js并将其放入本地目录并在脚本标记中使用它。

0

还要注意的是,当你移动到生产中的客户端的代码应该被更新:

var socket = io.connect('http://localhost:3000'); 

要像

var socket = io.connect('my_host'); 

我送my_host到客户端脚本我正在加载的页面socket.io,通过提取参数req.headers.host,对我来说它看起来像:

io.connect('http://' + host) 

您可以通过express-expose公开客户端上的变量。

0

这可能是因为io没有正确实例化,从而未捕获的ReferenceError:IO没有定义

// Instantiate without argument 
var io = require('socket.io')(); 
// Instantiate with new keyword 
var Server = require('socket.io') 
    , io = new Server(); 

// Instantiate io server with app as argument 
var app = require('http').createServer(handlerFunc) 
    , io = require('socket.io')(app); 
app.listen(80); 

// Attaching socket.io with express server 
var app = express() 
    , server = require('http').createServer(app) 
    , io = require('socket.io')(server); 
server.listen(80, handlerFunc); 
1

<script src="http://localhost:3000/socket.io/socket.io.js"></script>var socket = io.connect("http://localhost:3000");

用于连接到节点server.This这样,客户机将工作