javascript - 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 并且也不起作用)如果有人通过了这个并且知道我的问题可能是,我会很高兴。
解决方案
好的,让我们从一些非常基本的东西开始,这里是我们的快速服务器,它只托管我们的套接字应用程序:
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 上托管快速服务器来测试它。
推荐阅读
- ruby-on-rails - Errno::EPIPE:http post multipart ruby 中的管道损坏
- javascript - 如何使用javascript仅从表单中提取所选信息并基于键和值创建字典?
- c - exec 导致程序的堆和栈等部分内存空间重新初始化
- postgresql - 使用 manage.py loaddata 加载数据时 Postgres 中的重复记录
- email - 为 sendmail 创建邮件列表
- html - 隐藏 Shopify Prestige 主题的未选择变体图像
- javascript - 从字符串 javascript 中删除元音,为什么我的解决方案不起作用?
- html - 是否可以在没有媒体查询的情况下为每个屏幕尺寸选择媒体?
- angular-material - 使用 Angular 材质位于页面底部的导航选项卡
- shell - 执行 sed 命令时,文件中的某些选项卡会转换为单个空格