【发布时间】:2018-02-09 00:08:04
【问题描述】:
我无法让我的应用程序按我的意愿运行...我要做的是从 socket.io 客户端 (emitter.js) 向 socket.io 服务器 (receiver.io) 发送一条消息。 js) 然后在使用 Express/EJS (index.ejs) 生成的页面上显示消息
到目前为止,我成功的是:
// receiver.js
// This script initiates a simple HTML page using Express/EJS
// and then wait for socket.io connection on port 3000
const express = require('express')
const app = express()
const http = require('http')
app.set('view engine', 'ejs')
app.use(express.static('public'))
app.get('/', function (req, res) {
res.render('index.ejs', {params: 'some_params'})
})
app.server = http.createServer(app)
var io = require('socket.io')(app.server)
io.on('connection', function (socket) {
socket.emit('init', 'Init OK !')
console.log('init page ok')
socket.on('new_data', function(msg) {
console.log('socket.on received new data : ', msg)
socket.emit('new_data', 'Test')
})
})
app.server.listen(3000, function () {
console.log('Main app listening on port 3000')
})
以及附加的 index.ejs 文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="/socket.io/socket.io.js"></script>
</head>
<body>
<div id='new_msg'></div>
<script type="text/javascript">
$(document).ready(function() {
var socket = io()
socket.on('init', function(msg) {
console.log(msg)
$('#new_msg').html(msg)
})
socket.on('new_data', function(msg) {
console.log(msg)
$('#new_msg').html(msg)
})
});
</script>
</body>
最后是emitter.js 脚本:
// emitter.js
// Open io on port 3000 and then send a msg
var io = require('socket.io-client')
var socket = io.connect('http://localhost:3000')
socket.on('connect', function() {
socket.emit('new_data', 'some_new_data')
console.log('Send some_new_data')
})
然后我使用node receiver.js 运行服务器
应用程序启动,在控制台中我有消息:主应用程序正在侦听端口 3000,当我打开浏览器到 http://localhost:3000 时,我可以看到第一条消息 Init OK!
因此,receiver.js 可以成功发送到 index.ejs !
然后我使用node emitter.js 运行客户端。在发射器的控制台中,我有消息“发送 some_new_data”,在接收器的控制台中,我有消息“socket.on received new data : some_new_data”。
因此,emitter.js 可以成功发送到receiver.js,receiver.js 可以成功接收。
但是,我的问题是,最后一行 socket.emit('new_data', 'Test') 没有执行(或不起作用),因为 HTML 页面根本没有刷新......
所以,我不明白为什么在初始化期间消息会从接收器发送到 index.ejs,但在 ??...
如果有人对这个问题有一些想法,任何帮助都将非常感激!
【问题讨论】:
-
我很困惑。您有两个节点应用程序和一个浏览器页面?并且,一个应用程序将一个 socket.io 消息发送到另一个节点应用程序。那么,你想在那之后发生什么?
-
当
receiver.js收到new_data消息时,它会收到socket.emit('new_data', 'Test')。这只是发送回发送消息的套接字(这是另一个节点应用程序emitter.js)。这不会发送到网页。您是否尝试向所有连接的网页进行广播?如果是这样,你可以这样做io.emit('new_data', 'Test')。 -
天啊,它就是这样工作的!...非常感谢,这正是我想要的:-)!