如何触发节点中另一个函数的 websocket 发送?



我已经有一段时间没有使用Node和Websockets了。基本上,我如何让socket.send((从另一个函数工作是我所坚持的。

const server = new WebSocket.Server({ port: 8080 });
server.on('connection', socket => {
socket.on('message', message => {
console.log(`received from a client: ${message}`);
});
socket.send('yo world!');
});
function onMessageHandler (target, context, msg, self) {
client.say(target, response);
server.socket.send(response);
console.log(response);
}
}

如何让我的消息处理程序触发套接字发送,这是失败的...server.socket.send(response(;

看到你的问题,我认为对Websockets的工作原理缺乏了解。我假设您正在使用 https://github.com/websockets/ws

有两件事。首先是您命名为server的 WebSocketerver,然后是您命名为socket的单个套接字

现在要了解的是套接字无法在外部访问server.on() callback这样做的原因是在给定实例上可能连接了 1000 个套接字,并且无法唯一标识要向其发送消息的特定套接字。

因此,问自己一个问题,您的应用程序希望将消息发送到单个套接字,以发送给连接到您的服务器的每个人(基本上是广播(

如果要发送给个人,则必须唯一标识用户

this._wss = new WebSocket.Server({
port: ENV_APP_PORT_WS
});
this._wss.on("connection", async (ws: AppWebSocket, req: IncomingMessage) => {
// const ipAddress = req.connection.remoteAddress; // IP Address of User
logger.info(req);
const queryParams = url.parse(req.url, true).query;
let authUser: User;
try {
authUser = await this._authenticateWebSocket(queryParams);
} catch (e) {
// Terminate connection and return...
}
// WS User INIT
ws.isAlive = true;
ws.userId = authUser.id;
ws.uuid = Helpers.generateUUIDV4();
ws.send(JSON.stringify({
type: "connected",
env: ENV
}));
});

上面的代码将向每个套接字对象添加一个属性,使其能够唯一标识特定的用户/套接字。

发送时=>

onMessageHandler(targetUserId: number, message: string) {
const allSockets = <AppWebSocket[]>Array.from(this._wss.clients.values());
const targetSocket = allSockets.find(w => w.userId === targetUserId);
targetSocket.send(message);
}

如果你想发送给所有连接用户,这很容易:https://github.com/websockets/ws#server-broadcast

最新更新