首页 > 解决方案 > Socket.io 不能在没有 express 的情况下使用外部访问

问题描述

我的问题是我可以在不使用 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);
});

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

标签: javascriptnode.jssocketssocket.io

解决方案


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

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>

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

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


推荐阅读