我正在尝试做一个简单的即时消息应用程序,我一直在努力让WebSocket部分工作。我发现客户端可以成功地向服务器发送请求,但当我试图让服务器发送回客户端时,它只能使用io.emit而不是socket.emit,当我试图使用to()或in()使其发送到特定房间时,即使使用io.emit也不起作用,我需要它这样做。相反,它为那些超时。
委托方:
const socket = io('http://localhost:3000');
socket.on('connect', () => {
console.log('connected to socket');
});
socket.on('chat-message-out', (msg) => {
console.log('incoming message thru socket: ', msg);
setConvoMessages((prevMessages) => [msg, ...prevMessages]);
});
const sendMessage = (message, recipient) => {
socket.emit('chat-message-in', message, recipient);
};
const joinRoom = (convoId) => {
socket.emit('join-room', convoId);
console.log('joining room ', convoId);
};
字符串
伺服器:
io.on('connection', (socket) => {
console.log(`User connected with socket ID: ${socket.id}`);
socket.on('chat-message-in', (message, convoId) => {
console.log(`User ${socket.id} sending message to conversation ${convoId}: ${message.msgtext}`);
io.to(convoId).emit('chat-message-out', message, (error) => {
if (error) {
console.error('Error sending message:', error);
} else {
console.log('Message sent successfully');
}
});
});
socket.on('join-room', (convoId) => {
console.log(`User ${socket.id} joined conversation ${convoId}`);
socket.join(convoId);
});
socket.on('disconnect', () => {
console.log(`User ${socket.id} disconnected`)
});
});
instrument(io, {
auth: false,
});
型
为此,我的服务器记录:
User cW-J0NoNfpTTMjMKAAAL sending message to conversation BhzO0KukuC4zHb3o: dumb
Error sending message: Error: operation has timed out
at Timeout._onTimeout (/home/rvcross/repos/messaging-app/server/node_modules/socket.io/dist/broadcast-operator.js:182:17)
at listOnTimeout (node:internal/timers:569:17)
at process.processTimers (node:internal/timers:512:7)
型
但是如果我删除to()部分,它将成功地将消息发送到所有套接字。
“user _ sending message to conversation”部分被正确注销,这是值得的。
我已经使用了Admin-UI来确认套接字实际上在房间中(convoId),所以我不认为这是问题所在。
任何帮助将不胜感激!
1条答案
按热度按时间bkhjykvo1#
好吧,我似乎已经让它工作了。客户端是用React编写的,我在useEffect中使用了大部分套接字,但没有声明socket = io('http://localhost:3000 '),我只是在顶部与我的进口.每当组件重新渲染它会创建一个不同的套接字连接,但以前的连接创建的以前的渲染仍然存在.我不完全确定这是如何导致我的问题,但无论如何,移动套接字声明内useEffect得到了to().emit正常工作,虽然我的服务器仍然给我超时错误消息。