【问题标题】:Socket.io not working with external access without expressSocket.io 不能在没有 express 的情况下使用外部访问
【发布时间】:2018-05-14 16:55:01
【问题描述】:

我的问题是我可以在不使用 express 的情况下运行 socket.io 库吗?问题是我想让节点作为一个外部 Web 套接字服务器,它只接收套接字连接和回调,只是简单地回复它们,而不是制作自己的路由或发送页面视图(我正在使用 codeigniter 来完成这项工作)。

我目前在服务器上的测试应用是这样的:

var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 4000;

server.listen(port, function() {
  console.log('Server listening at port %d', port);
});

io.on("connection", function (socket) {
 console.log('A new socket has joined: ' + socket.id);
 var tweet = {user: "nodesource", text: "Hello, world!"};

// to make things interesting, have it send every second
var interval = setInterval(function () {
  socket.emit("tweet", tweet);
}, 1000);

 socket.on("disconnect", function () {
  clearInterval(interval);
 });
});

在客户端:

<script>
const socket = io('http://localhost:4000/node_server');


socket.on('disconnect',function(){
    alert('Im not connected, server is down');
});

socket.on("tweet", function(tweet) {
// todo: add the tweet as a DOM node
console.log("tweet from", tweet.username);
console.log("contents:", tweet.text);
});

我的问题是我已经用 express 测试了 socket.io 的聊天示例,它可以工作,但他们使用路由并发送页面,在我的情况下,我只希望我的其他外部页面与节点通信,而不是节点发送我的页面。基本上,当我在服务器或客户端触发一些发射或功能时,它不会仅在服务器连接上触发,而不会触发其他任何东西(ps:也使用了 io.sockets.on 并且也不起作用) 如果有人通过了这个并且知道我的问题可能是什么,我会很高兴。

【问题讨论】:

  • 如果您将此应用程序设置为一个单独的应用程序,那么您使用的服务器软件真的很重要吗?另外,您为什么要听 http://localhost:4000/node_server 而不是 http://localhost:4000 ?一个普通的 http 服务器会很痛苦。
  • 因为实际的客户端是位于另一个文件夹中的 index.html,而 node_server 实际上是 index.js 和节点模块能够启动服务器的位置。事情不是这样,事情是套接字连接并且您看到在节点控制台上触发的事件意味着套接字在服务器端连接,但它不会触发客户端连接函数,也不会触发我放在那里的回调和我已经测试了一些
  • 客户端的文件夹/文件在同一个主机上,但很快就会是不同的主机,但问题不是路径,真的是当我有一个稳定的连接时触发器不起作用
  • 另一件事,客户端 socket.connected 返回 false 表示套接字未连接,但在服务器中它注册并触发连接,所以我无法了解发生了什么
  • 我认为可能会有一些混乱,但据我所知,您似乎只想将客户端与服务器分开,因为它们托管在两台不同的机器上。是这样吗?如果是这样,我可以为你写一个简单的例子。

标签: javascript node.js sockets socket.io


【解决方案1】:

好的,让我们从一些非常基本的东西开始,这里是我们的快速服务器,它只托管我们的套接字应用程序:

var app = require("express")();
var server = require("http").createServer(app);
var io = require("socket.io")(server);
var port = process.env.PORT || 4000;

server.listen(port, function() {
  console.log("Server listening at port %d", port);
});

io.on("connection", function(socket) {
  console.log("A new socket has joined: " + socket.id);

  socket.on("hello", function(data) {
    console.log(data);
  });
});

您已经了解了很多,但是需要注意的是,此服务器将侦听来自任何地址的任何套接字连接。记住这一点很重要。

现在我们来看看客户端的html文件

<html>

<body>
    <button id="hiBtn">Say Hi to your server</button>
    <!-- You only need to include the client file here -->
    <script src="https://rawgit.com/socketio/socket.io-client/master/dist/socket.io.js" </script>
    </script>
    <script>
        const serverLocation = "localhost:4000" // or whatever your server location is
        const socket = io(serverLocation);

        window.onload = function () {
            document.getElementById("hiBtn").addEventListener("click", function () {
                socket.emit("hello", "Hi there, this is the client speaking");
            })
        }
    </script>
</body>

</html>

请注意我没有&lt;script src="/socket/socket.io"&gt;,这是因为这个 html 文件托管在一个完全独立的客户端上。您只需在此处包含客户端 socket.io 文件,如果您通过 NPM 安装它,该文件通常位于 node_modules\socket.io-client\dist\socket.io.js。或者您可以使用我在示例中提供的网址。只要确保serverLocation 指向您的快递服务器,一切就绪。

附:对于这个例子,如果你好奇的话,我通过在端口:5000 上托管 html 文件和在端口:4000 上托管快速服务器来测试它。

【讨论】:

  • 这不是我正在寻找的,而是每个文档示例都显示客户端和服务器位于 diff 文件夹或其他内容中的内容。我不想使用 express,因为我有我的 php 托管视图,并且这些视图有一个连接到 IO 的脚本。例如,我的 php 视图位于 localhost/platform/index.html 中,而我的节点位于 localhost/node_server 中,这就是为什么我试图专门为该文件夹连接端口:4000
  • 这是在连接 URL 上提到的文件夹
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 2016-12-25
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多