与 socket.io 私聊

Posted

技术标签:

【中文标题】与 socket.io 私聊【英文标题】:private chat with socket.io 【发布时间】:2017-04-13 01:42:56 【问题描述】:

我的聊天应用程序出现问题,我需要能够向特定用户发送私人消息,我能够选择该特定用户,但由于某种原因无法弄清楚如何发送私人消息消息。

您将在下面找到我的服务器的代码,请帮助:

var express = require('express');
var app = express();
var PORT = process.env.PORT || 8000;
var http = require('http').Server(app); // this is a node server that uses express as the boiler plate
var io = require('socket.io')(http); // socket! pass our server as a parameter to it


// use express static to expose a folder
app.use(express.static(__dirname + '/public'));

var users = [],
	connections = [];
var onlineClients = ;




// Register events on socket connection
io.on('connection', function(socket) 
	connections.push(socket);
	// console.log("connected socket", connections);

	socket.on("disconnect", function() 
		users.splice(users.indexOf(socket.username), 1);
		updateUsernames();
		connections.splice(connections.indexOf(socket), 1);
		console.log("disconnected socket", connections.length)
	);

	socket.on("send message", function(data) 
		// console.log(data);
		io.emit("new message", msg: data, user: socket.username);
	);


	socket.on("notify user", function(data) 
		io.emit("notify user", user: socket.username)
	);


	socket.on("new user", function(data) 
		socket.username = data;
		users.push(socket.username);
		updateUsernames();

	);

	function updateUsernames() 
		io.emit("get users", users);
	;

	socket.on("private", function(data, recipientName) 
		var recipient = connections.filter(function (recipient) 
			return recipient.username === recipientName;
		)[0];
			console.log(recipient.id);
			console.log(data);
		io.sockets.socket(recipient.id).emit("received private msg", data);

	);


	// socket.on("create room", function(room) 
	// 	socket.join(room);
	// 	io.sockets.in(room).emit('event', "hey wusup am in this room");
	// 	console.log(socket);

	// )

);

http.listen(PORT, function()
  console.log('Server started on port ' + PORT);
);

【问题讨论】:

创建一个私人房间,然后向该房间中的特定用户发送消息 客户端只向服务器发送消息。如果您希望客户端将消息发送给特定用户,那么您将消息发送到服务器,然后告诉服务器您希望服务器将消息传递给哪个用户。 【参考方案1】: 首先在聊天室中添加用户,以便在您的私人聊天室中轻松找到用户

您加入私人房间的客户端代码

<input type="text" class="form-control" id="user_email" placeholder="user_email"  />
<button text="join room" class="btn btn-primary btn-block" onclick="a();"> Join Room</button>

您在客户端的 javascript 代码

function a()
    io.emit('privatechatroom', email:document.getElementById('user_email').value);

您的服务器端代码以在您的房间中添加用户

socket.on('privatechatroom',function(data)
    socket.join(data.email);
    io.emit('res',mes:"you are added")
);

现在您可以向最近添加到此房间的那个人发送私人消息 客户端

function b() 
    io.emit('sendmail',  email: document.getElementById('sender_mail').value, message: document.getElementById('message').value );
    $('#message').val('');

/*serverside code*/
socket.on('sendmail', function (data) 
    io.sockets.in(data.email).emit('new_msg',  msg: data.message );
    console.log(data.email);
);

【讨论】:

感谢 Adil 的帮助,但不确定这是否适用于我的情况,我通过向该特定用户添加点击事件向客户端发送私人消息,我能够获取 id 但不知道如何发送消息,我尝试了不同的方法,我知道我应该在服务器端进行一些更改:【参考方案2】:

这是我对您问题的明确解决方案...

Send a message to Particular client(Private chat)

我希望它对你有用..

【讨论】:

以上是关于与 socket.io 私聊的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 与私人房间聊天

socket.io 和 reactjs 实现即时通讯

Vue 使用 Vue-socket.io 实现即时聊天应用(通讯篇)

io.emit 与 socket.emit

engine.io 与 socket.io 有何不同?

从android与socket.io通信