我正在使用socket.io + node.js,我知道如何在本地发送消息并使用socket.broadcast.emit()
函数进行广播:所有连接的客户端都会收到相同的消息。
现在,我想知道如何向特定客户端发送私人消息,即一对一的客户端流式通信。谢谢。
我正在使用socket.io + node.js,我知道如何在本地发送消息并使用socket.broadcast.emit()
函数进行广播:所有连接的客户端都会收到相同的消息。
现在,我想知道如何向特定客户端发送私人消息,即一对一的客户端流式通信。谢谢。
var socket = io.connect('http://localhost');
socket.emit('join', {email: user1@example.com});
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('join', function (data) {
socket.join(data.email); // We are using room of socket io
});
});
现在每个用户都加入了一个以用户电子邮件命名的房间。因此,如果您想向特定用户发送消息,只需
服务器端:
io.sockets.in('user1@example.com').emit('new_msg', {msg: 'hello'});
在客户端上要做的最后一件事情就是监听“new_msg”事件。
客户端:
socket.on("new_msg", function(data) {
alert(data.msg);
}
我希望你能理解这个想法。
socket.io-redis
在节点群集(多个进程)中工作。 - Daniel Que{email:user1@example.com}
对于所有连接都不同,难道所有访问应用程序的客户端都有用户user1@example.com
吗?当第二个客户端连接时,我该如何将其设置为用户user2@example.com
,以便我可以拥有不同的房间。如果这是一个烦人的问题,那我很抱歉。 - jack blank当用户连接时,应向服务器发送消息,其中包含一个类似于电子邮件的唯一用户名。
一个用户名和socket对应关系应该被存储在一个像这样的对象中:
var users = {
'userA@example.com': [socket object],
'userB@example.com': [socket object],
'userC@example.com': [socket object]
}
在客户端,使用以下数据向服务器发送一个对象:{
to:[the other receiver's username as a string],
from:[the person who sent the message as string],
message:[the message to be sent as string]
}
在服务器端,监听消息。当接收到消息时,将数据发送给接收方。
users[data.to].emit('receivedMessage', data)
在客户端,监听来自服务器的名为“receivedMessage”的事件,并通过读取数据处理它来自谁以及发送的消息。
在客户端,监听来自服务器的名为“receivedMessage”的事件,并通过读取数据处理它来自谁以及发送的消息。
from: [发送消息的人(字符串)],
message: [要发送的消息(字符串)]
}
为什么是字符串? - user4909217SURE: 简单来说,
这就是你所需要的:
io.to(socket.id).emit("event", data);
每当用户加入服务器时,将生成套接字详细信息,包括ID。这个ID确实有助于向特定的人发送消息。
首先,我们需要将所有套接字ID存储在数组中,
var people={};
people[name] = socket.id;
这里的名字是收件人的名字。 示例:
people["ccccc"]=2387423cjhgfwerwer23;
因此,现在我们可以在发送消息时使用接收器名称获取socket.id:
为此,我们需要知道接收方的名称。您需要将接收器名称发射到服务器。
最后一件事是:
socket.on('chat message', function(data){
io.to(people[data.receiver]).emit('chat message', data.msg);
});
希望这对你有所帮助。
祝好运!!
user.#{userid}
。io.sockets.in('user.125').emit('new_message', {text: "Hello world"})
客户端Socket.io
socket.on('connect', function () {
socket.emit('join', {email: user@example.com});
});
io.on('connection', function (socket) {
socket.on('join', function (data) {
socket.join(data.email);
});
});
现在我们已经完成了连接的设置。让我们向服务器的to
房间发射一些东西,这样用户就可以听取。
服务器 Socket.io
io.to('user@example.com').emit('message', {msg: 'hello world.'});
socket.on("message", function(data) {
alert(data.msg);
});
来自Socket.IO的参考资料。
in
来发出事件。但在我的情况下,我使用to
来发出事件。希望你以前见过这个。 - Lalit Mohan // Build The Chat Room
if (Integer.parseInt(mySqlUserId) < Integer.parseInt(toMySqlUserId)) {
room = "ic" + mySqlUserId + toMySqlUserId;
} else {
room = "ic" + toMySqlUserId + mySqlUserId;
}
全套作品
包 Json
"dependencies": {
"express": "^4.17.1",
"socket.io": "^2.3.0"
},
"devDependencies": {
"nodemon": "^2.0.6"
}
app = require('express')()
http = require('http').createServer(app)
io = require('socket.io')(http)
app.get('/', (req, res) => {
res.send('Chat server is running on port 5000')
})
io.on('connection', (socket) => {
// console.log('one user connected ' + socket.id);
// Join Chat Room
socket.on('join', function(data) {
console.log('======Joined Room========== ');
console.log(data);
// Json Parse String To Access Child Elements
var messageJson = JSON.parse(data);
const room = messageJson.room;
console.log(room);
socket.join(room);
});
// On Receiving Individual Chat Message (ic_message)
socket.on('ic_message', function(data) {
console.log('======IC Message========== ');
console.log(data);
// Json Parse String To Access Child Elements
var messageJson = JSON.parse(data);
const room = messageJson.room;
const message = messageJson.message;
console.log(room);
console.log(message);
// Sending to all clients in room except sender
socket.broadcast.to(room).emit('new_msg', {
msg: message
});
});
socket.on('disconnect', function() {
console.log('one user disconnected ' + socket.id);
});
});
http.listen(5000, () => {
console.log('Node app is running on port 5000')
})
public class SocketIOClient {
public Socket mSocket;
{
try {
mSocket = IO.socket("http://192.168.1.5:5000");
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
public Socket getSocket() {
return mSocket;
}
}
public class IndividualChatSocketIOActivity extends AppCompatActivity {
// Activity Number For Bottom Navigation Menu
private final Context mContext = IndividualChatSocketIOActivity.this;
// Strings
private String mySqlUserId;
private String toMySqlUserId;
// Widgets
private EditText etTextMessage;
private ImageView ivSendMessage;
// Socket IO
SocketIOClient socketIOClient = new SocketIOClient();
private String room;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
// Widgets
etTextMessage = findViewById(R.id.a_chat_et_text_message);
ivSendMessage = findViewById(R.id.a_chat_iv_send_message);
// Get The MySql UserId from Shared Preference
mySqlUserId = StartupMethods.getFromSharedPreferences("shared",
"id",
mContext);
// Variables From Individual List Adapter
Intent intent = getIntent();
if (intent.hasExtra("to_id")) {
toMySqlUserId = Objects.requireNonNull(Objects.requireNonNull(getIntent().getExtras())
.get("to_id"))
.toString();
}
// Build The Chat Room
if (Integer.parseInt(mySqlUserId) < Integer.parseInt(toMySqlUserId)) {
room = "ic" + mySqlUserId + toMySqlUserId;
} else {
room = "ic" + toMySqlUserId + mySqlUserId;
}
connectToSocketIO();
joinChat();
leaveChat();
getChatMessages();
sendChatMessages();
}
@Override
protected void onPause() {
super.onPause();
}
private void connectToSocketIO() {
socketIOClient.mSocket = socketIOClient.getSocket();
socketIOClient.mSocket.on(Socket.EVENT_CONNECT_ERROR,
onConnectError);
socketIOClient.mSocket.on(Socket.EVENT_CONNECT_TIMEOUT,
onConnectError);
socketIOClient.mSocket.on(Socket.EVENT_CONNECT,
onConnect);
socketIOClient.mSocket.on(Socket.EVENT_DISCONNECT,
onDisconnect);
socketIOClient.mSocket.connect();
}
private void joinChat() {
// Prepare To Send Data Through WebSockets
JSONObject jsonObject = new JSONObject();
// Header Fields
try {
jsonObject.put("room",
room);
socketIOClient.mSocket.emit("join",
String.valueOf(jsonObject));
} catch (JSONException e) {
e.printStackTrace();
}
}
private void leaveChat() {
}
private void getChatMessages() {
socketIOClient.mSocket.on("new_msg",
new Emitter.Listener() {
@Override
public void call(Object... args) {
try {
JSONObject messageJson = new JSONObject(args[0].toString());
String message = String.valueOf(messageJson);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(IndividualChatSocketIOActivity.this,
message,
Toast.LENGTH_SHORT)
.show();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void sendChatMessages() {
ivSendMessage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = etTextMessage.getText()
.toString()
.trim();
// Prepare To Send Data Thru WebSockets
JSONObject jsonObject = new JSONObject();
// Header Fields
try {
jsonObject.put("room",
room);
jsonObject.put("message",
message);
socketIOClient.mSocket.emit("ic_message",
String.valueOf(jsonObject));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
public Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(IndividualChatSocketIOActivity.this,
"Connected To Socket Server",
Toast.LENGTH_SHORT)
.show();
}
});
Log.d("TAG",
"Socket Connected!");
}
};
private Emitter.Listener onConnectError = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
};
private Emitter.Listener onDisconnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
};
}
// SocketIO
implementation ('io.socket:socket.io-client:1.0.0') {
// excluding org.json which is provided by Android
exclude group: 'org.json', module: 'json'
}
不需要创建房间 (因为你只想要向一个人发送消息),我所做的是创建一个内存数组:
clientSessions: Map<string, UserIdentifier> = new Map()
const socket = io('http://localhost:3200', {query: {randomKeyID: '123'}});
服务器端:
handleDisconnect(client: Socket) {
const query = client.handshake.query;
const randomKeyID = <string> query.randomKeyID
this.clientSessions.delete(randomKeyID);
console.log(`Client disconnected: ${client.id}`);
}
handleConnection(client: Socket, ...args: any[]) {
const query = client.handshake.query;
const user: UserIdentifier = {
id: client.id,
randomKeyID: <string> query.randomKeyID
}
this.clientSessions.set(user.randomKeyID, user);
console.log(`Client connected: ${client.id}`);
}
在服务器端也添加了这个,以便轻松访问websocket (类型Server来自socket.io):
@WebSocketServer()
server: Server;
所以,如果我想发送给特定的客户端,我可以:
const { randomKeyID } = this.clientSessions.get(something);
this.server.to(randomKeyID).emit('clientListener', 'Hello');