【问题标题】:Node.js, socket.io, require()Node.js、socket.io、require()
【发布时间】:2012-08-03 12:09:48
【问题描述】:

我的目标:创建将在两个 Web 浏览器之间发送 antyhing(事件、字符串、函数调用)的 node.js 服务器和客户端应用程序。

我安装并创建了简单的服务器,但是从创建客户端开始出现问题。正如http://socket.io/ 所说,我通过命令安装了它:

npm install socket.io

但基本示例中需要的文件:

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

未下载或安装。 /node_modules/socket.id/lib 中有类似名称的文件,但文件是同一个文件吗?我认为这是 socket.io 客户端,但作为服务器模块,而不是 Web 浏览器 javascript,对吗?

如何获得socket.io.js,它可以正常工作并且可以连接到node.js服务器,而不会出现io/socket/require未定义等错误?

我不想创建响应正常 http 请求的网络服务器。我希望服务器能够保持连接并能够在两个浏览器中的 JS 脚本之间进行通信

我只能忍受,每个人都在写关于 node.js 的形式,就像世界上每个人在每个可能的目录中都有 socket.io.js 文件一样。可能的重复:

socket.io.js not found

以不在干净 JavaScript API 中的函数调用 require() 开始。所以我什至不尝试这个解决方案。任何人都可以解释如何正确包含和定义 io.* 吗?是关于 Express 框架的吗?为什么 node.js 和 socket.id 页面只字不提 express 需求?

问题是,我需要一个 CLIENT js 库,我的意思不是“服务器上的客户端”,我的节点二进制服务器将能够连接到其他页面/服务器并进行通信。我的意思是 HTML 客户端页面中的客户端。并且,如果需要,其他相关的 JS。

我从http://serv1.aelag.com:8084/的演示中获取了一个示例

/** Socket.IO 0.6.2 - Built with build.js */
/**
 * Socket.IO client
 * 
 * @author Guillermo Rauch <guillermo@learnboost.com>
 * @license The MIT license.
 * @copyright Copyright (c) 2010 LearnBoost <dev@learnboost.com>
 */

this.io = {
    version: '0.6.2',
...

如何以正常方式获取该文件而不是从其他服务器窃取(可能不稳定或旧版本)?我需要那个文件。有任何依赖关系吗?我应该通过构建它“build.js”来创建它还是开发人员这样做?

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

我终于解决了这个问题

socket.io 脚本不作为平面文件存在。它由 node.js 服务器生成 并提供给浏览器。所以。包括它:

&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;

仅当 node.js 服务器与带有 web 应用程序的 web 服务器在同一端口上启动时才有效。如果您尝试从端口 80 上的例如 apache 加载此脚本,则需要将整个路径放入 node.js 服务器侦听主机:

&lt;script src="http://localhost:8080/socket.io/socket.io.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案2】:

    您确实需要在任何地方添加/socket.io/socket.io.js。如果您通过npm install socket.io 安装了socket.io,您的应用程序知道如何处理它。几个月前我自己玩过socket.io,这是我想出的一个非常简单的“聊天”,它很有效。所以它可能会帮助你! (我正在使用 ExpressJS。顺便说一句,这是一个非常有用的 Node.JS 框架)

    这是你的服务器端应用程序:

    var app = require('express').createServer();
    var io = require('socket.io').listen(app);
    
    app.listen(3000);
    
    app.get('/', function (req, res) {
      res.sendfile(__dirname + '/index.html');
    });
    
    io.sockets.on('connection', function (socket) {
        socket.on('news', function (data) {
            socket.emit('news', { content: data.text });
            socket.broadcast.emit('news', { content: data.text});
        });
    });
    

    这是你的 index.html

    <!DOCTYPE html>
    <html>
    <head>
    <title>socket test</title>
    </head>
    <body>
    <input type="text" id="Username"> <input type="text" id="Content"><input type="button" value="send" onclick="sendMessage()"><br />
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://localhost:3000/pathtoproject');
      socket.on('news', function (data) {
        document.body.innerHTML += data.content + "<br />";
      });
      function sendMessage() {
          socket.emit('news', { text: document.getElementById('Username').value + ": " + document.getElementById('Content').value });
      }
    </script>
    </body>
    </html>
    

    【讨论】:

    • 再一次 :) 您确实在 CLIENT html 页面的 HEAD 部分中包含 &lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;。这与npm install socket.io 无关,很明显,如果我得到你的 index.html 并放在网络服务器上,当浏览器请求 http://site.....com/socket.io/socket.io.js 时会有一个 404 响应代码,因为你确实需要将 JS 文件放在网络上将其包含在 head 中并已定义“io”的服务器路径。
    • 当然你必须在你的html文件中包含&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt;这一行。我的意思是您确实需要创建一个名为 socket.io 的文件夹和一个名为 socket.io.js 的文件,位于同一文件夹中。您的应用程序将处理此问题。
    【解决方案3】:

    我设法像这样在客户端加载了 socket.io:

    jQuery.getScript("bower_components/socket.io/lib/socket.js", function() {
       var socket = io.connect('http://localhost');
       socket.on('news', function (data) {
         console.log(data);
         socket.emit('my other event', { my: 'data' });
       });
    });
    

    【讨论】:

      猜你喜欢
      • 2012-02-15
      • 2023-02-19
      • 2011-12-02
      • 2011-03-28
      • 2012-09-19
      • 2013-03-16
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多