【问题标题】:Clients not receiving events in Socket.IO客户端未在 Socket.IO 中接收事件
【发布时间】:2018-10-18 06:17:20
【问题描述】:

我这里有一个简单的聊天室:

app.js

const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const fs = require('fs');

app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket) {
    var messages;
    fs.readFile('log.txt', 'utf8', function(err, data) {
        messages = data.split('|/');
        for (i = 0; i < messages.length; i++) {
            socket.emit('message', messages[i]);
        }
        if (err) throw err;
    })
    socket.on('message', function(data) {
        fs.appendFile('log.txt',
            '<span class="seen">' + data.name + ': ' + data.msg + '</span>' + '|/',
            function(err) {
            if (err) throw err;
        })
        socket.broadcast.emit('message', data);
    })
})

http.listen(2099, function(){
    console.log('litening on :2099');
});

index.HTML

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head>
<title>chat</title>
<style>
body {
    font-family: sans-serif;
    font-size: 18px;
    background: #404040;
}
input[type=text],[type=submit] {
    font-size: 18px;
}
#chatList {
    list-style: none;
    margin: 0;
    padding: 0;
}
#inputContainer {
    position: fixed;
    bottom: 0;
    width: 100%;
    margin: 10px;
}
#input {
    width: calc(90% - 40px);
    padding: 10px 20px;
    border: 1px solid white;
    border-radius: 10px;
    margin-right: -3px;
    display: inline-block;
    color: white;
    background: #404040;
}
#submit {
    border: 1px white solid;
    border-radius: 10px;
    padding: 11px 2.2%;
    color: white;
    background-color: #404040;
}
.msg {
    margin: 0 12px 0px 12px;
    padding: 12px;
    border-bottom: 1px solid gray;
    color: white;
}
.income {
    color: crimson;
}
.sender {
    color: cyan;
}
</style>
 </head>
</head>
<body>
<div id='chat'>
<ul id='chatList'>
</ul>
</div>
<div id='inputContainer'>
<input type="text" id='input' placeholder="Type a message..." autocomplete="off">
<input type="submit" id='submit' value="Send" onclick="send()">
</div>
</form>
<script src='/socket.io/socket.io.js'></script>
<script>
document.getElementById('input').value = '';
var socket = io();
document.addEventListener("keydown", function(e) {
    if (e.keyCode == 13) {
        send();
    }
})
function send() {
    value = document.getElementById('input').value;
    if (value != '') {
        socket.emit('message', {msg: value, name: username})
        var list = document.getElementById('chatList');
        var msg = document.createElement('li');
        msg.className = 'msg';
        msg.innerHTML = '<span class="sender">' + username + '</span>' + ': ' + value;
        list.appendChild(msg);
        document.getElementById('input').value = '';
    }
}
socket.on('message', function(data) {
    var list = document.getElementById('chatList');
    var msg = document.createElement('li');
    msg.className = 'msg';
    msg.innerHTML = data;
    list.appendChild(msg);
})
document.getElementById('input').value = '';
var username = prompt('Choose a username:');
if (username == '') {
    username = 'mysteryman' + Math.floor(Math.random() * 100);
}
</script>
</body>
</html>

所以这个函数:

fs.readFile('log.txt', 'utf8', function(err, data) {
        messages = data.split('|/');
        for (i = 0; i < messages.length; i++) {
            socket.emit('messages', messages[i]);
        }
        if (err) throw err;
    })

假设从 log.txt 读取数据并将其作为事件发送给客户端以加载旧消息。它工作正常,但即使此循环正在运行并发送事件,客户端也没有收到任何事件。

我已尝试确保在发送数据之前加载所有事件。

任何帮助将不胜感激!!!

【问题讨论】:

  • 您确定messages 事件已被触发?也许 log.txt 是空的。在使用 data 变量之前,您需要检查 if (err) throw err;。为什么你知道客户端没有收到任何消息?
  • @hoangdv 我console.log 每次循环运行以确保其正常工作。 log.txt 也不为空
  • hmm,我觉得你的客户端出了点问题,打开浏览器的开发者工具,或许能帮助你找到解决办法。
  • @hoangdv 非常干净 :( 我现在真的很困惑
  • 我要把你的代码克隆到我的本地......

标签: javascript html node.js socket.io


【解决方案1】:

您的拼写错误,您在服务器端发出 messages 事件,但在客户端监听 message(没有 s)事件。

【讨论】:

  • 已修复,但仍无法正常工作。也非常感谢你在做什么,继续加油吧:)
【解决方案2】:

我的猜测是当服务器触发socket.emit('message'...时,客户端中的套接字还没有注册socket.on('message'...

【讨论】:

  • 遗憾的是,事实并非如此。我添加了一个事件,该事件仅在加载所有其他事件(脚本结束)时触发,然后仅激活文件读取,但仍然无法正常工作。
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2013-03-06
  • 1970-01-01
  • 2021-05-23
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多