Socket.io未被Node.js服务器提供

7

据我理解,从http://socket.io/#how-to-use得知,node.js会自动在服务器上提供socket.io文件。

我已经通过npm install socket.io安装了socket.io,并且我可以看到它位于服务器根目录的上一级的node_modules中。

server.js:

    var static = require('./plugins/node-static');
var socketIO = require('socket.io');
var clientFiles = new static.Server('./client');

var http = require('http');
httpServer = http.createServer(function (request, response) {
    request.addListener('end', function () {
            clientFiles.serve(request, response);
        });
}).listen(8253);

var webSocket = socketIO.listen(httpServer);
webSocket.on('connection', function(client) { .....

index.html:

<html>
<head>
    <title>Chat</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script type="text/javascript"
            src="http://code.jquery.com/jquery-1.5.2.js"></script>

    <script type="text/javascript">
        $(document).ready(function() {
            var webSocket = new io.Socket('localhost', { port: 8253 });
            webSocket.connect(); .......

启动服务器没问题,但打开index.html时,我收到以下错误:

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

有什么想法吗?

我可以看到它驻留在比服务器根目录高一级的node_modules中。你所说的“服务器根目录”是什么意思?不会与任何Apache的痕迹混淆,对吧?由NPM安装的模块驻留在NPM存储库中,它们不必与您项目的主节点脚本有任何关系。成功的require('socket.io')表示安装正确,问题在于代码。 - Kos
4个回答

6

在使用socket.io绑定服务器后,尝试侦听它。

将此代码放置于您的文件中:

httpServer.listen(8253);

之后

var webSocket = socketIO.listen(httpServer);

3

编辑:抱歉,我写的内容并未回答你的问题。

在客户端方面,您需要以下内容:

var socket = io.connect(); //Hostname and port not required - Autodetected
socket.on('connect', function(){
  $('#status').text('Connected');
});
socket.on('message', function(m){
 $('#message').text(m);
});
socket.on('disconnect', function(){
 $('#status').text('Disconnected');
});

工作示例 => https://github.com/parj/node-websocket-demo/blob/master/public/main.js

NPM信息(如果需要):如果您使用的是Linux操作系统

cd <location of your server.js>
npm install -g socket.ion #install globally
npm link socket.io. #Create a symbolic link 

如果你使用的是Windows系统,无法执行npm link命令。

cd <location of your server.js>
npm install socket.io

您的目录结构应该如下所示:
server.js
node_modules/ #Directory - same level as server.js
    socket.io #socket.io underneath that

node_modules应该与server.js在同一目录下,而不是在服务器根目录上方


我不记得自己曾经需要执行过这样的操作,介绍教程也没有建议。npm install socket.io 应该就可以了。 - Kos
顺便问一下,“如果你在使用Windows”,npm现在支持Windows吗? - Kos
很高兴能够帮忙 - 如果您想进行套接字发射(用于传输JSON)和自定义事件 - 另一个示例 - https://github.com/parj/node-websocket-demo/tree/socket_emit - First Zero
我相信我们中有人在这里混淆了什么 :-) 你暗示 npm install 是某种程度上的项目本地化,而 npm install -g 是全局的。我印象中 npm install 是本地的,就像对于当前用户一样,不是针对一个项目的,所以(与你所说的相反)你不需要为任何项目做一次。最重要的是,你需要 root 访问权限才能执行 install -g,不是吗?(我无法在这里检查) - Kos
此外,npm文档建议对于你要require()的包进行本地安装。 - Kos
显示剩余3条评论

2

当你从一个常规表达式应用程序进行转换时:

const express = require('express')
const app = express()
app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

重要的是要做两件事:

第一件事(我相信每个人都能做到):

var server = require('http').Server(app);
var io = require('socket.io')(server);

第二个问题(这一个很容易被忽略): 调用server.listen而不是app.listen

我花了将近两个小时来调试这个问题,所以现在进行记录。


0

你需要将 localhost 添加到你的 script src 标签中,就像下面这样

<script src="http://localhost:8253/socket.io/socket.io.js"></script>

或者你可以使用位于node_modules文件夹中的同一文件

<script src="http://localhost:8253/node_modules/socket.io/client-dist/socket.io.js"></script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接