请注意: 我知道这可能是其他问题的重复,但我希望能帮助我的代码!!
我正在尝试为我的社交网络构建聊天功能..我已经使用了node.js和socket.io ...这段代码的问题在于,消息正在传递给每个连接的用户而不仅仅是目标的to_user ...此代码的来源来自于newboston教程...... 我现在就像这样构建它:
client.php
<div class="chat" hidden>
<textarea class="chat-name"><?php echo escape($data->username); ?></textarea>
<div class="chat-messages">
<?php
$chtrndr = $cht->renderchats(escape($data->id));
foreach ($chtrndr as $chtrndrs) {
echo '<div>' . $chtrndrs['m_from'] . ': ' . $chtrndrs['m_text'] . '</div><br>';
}
?>
</div>
<textarea class="chat-textarea" placeholder="Type your message"></textarea>
<div class="chat-status">Status:<span>Idle</span></div>
</div>
<!-- <script src="/socket.io/socket.io.js"></script> -->
<script src="http://127.0.0.1:8080/socket.io/socket.io.js"></script>
<script src="server.js"></script>
<script>
(function(){
var getNode = function(s) {
return document.querySelector(s);
},
//get required nodes
status = getNode('.chat-status span'),
messages = getNode('.chat-messages'),
textarea = getNode('.chat-textarea'),
chatName = getNode('.chat-name'),
statusDefault = status.textContent,
setStatus = function(s) {
status.textContent = s;
if(s!==statusDefault)
{
var delay = setTimeout(function(){
setStatus(statusDefault);
clearInterval(delay);
},3000);
}
};
setStatus('testing');
try {
var socket = io.connect('http://127.0.0.1:8080');
}
catch(e)
{
//set status to warn user
}
if(socket!==undefined)
{
//listen for output
socket.on('output',function(data){
if(data.length)
{
//loop through results
for(var x=0;x<data.length;x=x+1)
{
var message = document.createElement('div');
message.setAttribute('class','chat-message');
message.textContent = data[x].m_from + ': ' + data[x].m_text;
//append
messages.appendChild(message);
messages.insertBefore(message, messages.firstChild);
}
}
});
//listen for a status
socket.on('status',function(data){
setStatus((typeof data === 'object') ? data.message : data);
if(data.clear === true)
{
textarea.value = '';
}
});
//listen for keydown
textarea.addEventListener('keydown',function(event){
var self = this,
fname = <?php echo escape($_SESSION['user']); ?>,
tname = <?php echo $data->id; ?>;
if(event.which === 13 && event.shiftKey === false) {
socket.emit('input', {m_from:fname, m_to:tname, m_text:self.value});
event.preventDefault();
}
});
}
})();
</script>
这是服务器文件: 的 SERVER.js
var client = require('socket.io').listen(8080).sockets;
var express = require('express');
var app = express();
var mysql = require('mysql');
var path = require('path');
var dbconn = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'test'
});
app.use(express.static(path.resolve(__dirname, './css/')));
app.get('/',function(req,res){
res.sendFile(__dirname + '/index.html');
});
dbconn.connect(function(err){
if(err){
console.log('Database connection error');
}else{
console.log('Database connection successful');
}
client.on('connection',function(socket){
console.log('Data received from Db');
sendStatus = function(s){
socket.emit('status',s);
};
//wait for input
socket.on('input',function(data){
var fname = data.m_from,
tname = data.m_to,
m_text = data.m_text,
whitespacePattern = /^\s*$/;
if(whitespacePattern.test(m_text))
{
sendStatus('message is required');
}
else
{
var record = { m_from: fname, m_to:tname, m_text: m_text };
dbconn.query('INSERT INTO messages SET ?', record, function(err,res){
if(err) throw err;
client.emit('output',[data]);
sendStatus({
message: "message sent",
clear: true
});
});
}
});
});
});
我想添加以下功能: *(a)*由于它是一个社交网络,它可以提供私人聊天服务,登录用户... (b)接收者在稍后重新登录后会收到这些消息。
我已经在谷歌搜索了很多页面,并且听说房间是我的首选。但作为nodejs中的菜鸟,idk如何实现房间,使私人消息可能... 如果any1 cud帮我编码,甚至把我放在正确的路径上,我可以学习在node.js中编写代码,并为初学者提供简单的教程,它真的很有帮助! Thanx提前!
答案 0 :(得分:0)
看起来应该是应用程序中的每个用户都应该唯一ID
<强> LOGIC 强>
1.您必须在 output_userId
上从后端(服务器端)发出事件这样做会让您从服务器端向特定用户发出消息,并且每个用户都将监听 output_userId ,这是他们的特定ID。其中 userId 是项目的唯一ID。
示例:
我们有3个用户 1,2,3现在,如果用户1正向用户2发送消息
你的活动应该像
服务器端
Socket.emit(OUTPUT_1)
客户端
每个客户端用户都应该收听他们的output_userid
对于用户1,它应该是output_1
对于用户2,它应该是output_2
对于用户3,它应该是output_3