我正在尝试学习如何使用socket.io
,ejs
,nodejs
...
所以我基本上是在以下回购中研究代码:https://github.com/ngrt/simpleChatApp
文件夹结构类似于
simpleChatApp
(父文件夹)
-views(包含index.ejs
)
-public(包含style.css
和chat.js
)
-app.js(具有服务器代码的文件)
app.js具有app.use(express.static('public'))
,因此公共作品是root
现在问题出在chat.js(其中包含客户端后端)中
下面的图片是chat.js的一部分
send_message.click(function(){
socket.emit('new_message', {message : message.val()})
})
//Listen on new_message
socket.on("new_message", (data) => {
feedback.html('');
message.val('');
chatroom.append("<p class='message'>" + data.username + ": " + data.message + "</p>")
})
在发射部分,我们仅发送了一个消息字段.....而在套接字部分,我们使用了data.username()...现在,我认为数据基本上是我们发送的对象。 ...其中不包含任何用户名..那么如何使用它..导致其正常工作,因此代码正确..但我不明白为什么
答案 0 :(得分:1)
客户端socket.on
接收到的消息是由nodejs的send发出的(而不是您的代码中客户端的)。这是node js
的代码,其中添加了用户名:
socket.on('new_message', (data) => {
//broadcast the new message
io.sockets.emit('new_message', {message : data.message, username : socket.username});
})
通常,在您的示例中,多个客户端正在侦听服务器消息,而服务器正在侦听每个客户端的发射。服务器将用户名存储在每个新的socket
对象上。连接时的初始值为“匿名”,并在change_username
事件中更新:
socket.on('change_username', (data) => {
socket.username = data.username
})
{p}中的第一个 send_mesasage emit由chat.js
received并立即emitted发送给所有已连接的客户端( 包括发件人 )。
服务器为此发射添加用户名(服务器已将其存储在app.js
对象中)。
然后,每个客户端receives都会发出此消息(已经有一个用户名)。然后所有{@ 3}}已连接的客户端都会收到消息和用户名