使用nodejs / socket.io将msg传输到nodejs / express

时间:2018-02-09 00:08:04

标签: node.js express socket.io

我无法让我的应用程序按照我的意愿运行...我想要做的是从socket.io客户端(emitter.js)向socket.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运行客户端。在发射器的控制台中,我有消息'send some_new_data',并且在接收器的控制台中我有消息'socket.on收到新数据:some_new_data'。

因此,emitter.js可以成功发射到可以成功接收它的receiver.js。

但是,我的问题在于,最后一行socket.emit('new_data', 'Test')是否未执行(或无效),因为HTML页面根本没有刷新....

所以,我不明白为什么在初始化期间从接收器向index.ejs发出消息但是之后没有工作?? ...

如果有人对这个问题有一些想法,那么任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

receiver.js收到new_data消息时,它会:

socket.emit('new_data', 'Test')

它只是发送回发送消息的套接字(这是另一个节点应用emitter.js)。这不会发送到网页。

如果您尝试向所有连接的网页广播,那么您可以使用以下方式进行广播:

io.emit('new_data', 'Test')