在WebSocket中,dispatchEvent()有什么用?

qyyhg6bp  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(242)

我注意到WebSocket extends EventTargetEventTarget.dispatchEvent()sends an Event to the object“。但是从那个MDN文档中还不清楚对象是谁。
我曾认为该对象可能是WebSocket服务器端的接收器,而dispatchEvent()是另一种向ws服务器发送消息的方式,如WebSocket.send()
所以我在浏览器控制台中做了下面的测试,看看是否是这样(使用https://github.com/websockets/ws作为ws服务器)。

const ws = new WebSocket('ws://localhost:3000');

//instead of using ws.send('hello world'); I use dispatchEvent here
//as I want to know what dispatchEvent does, 
//e.g can it send my message to ws server like send() ?

ws.addEventListener('open', (evt) => {
      let event = new MessageEvent('message', {
          data: "hello world",
          lastEventId: '101'
       });
  ws.dispatchEvent(event);
});

ws.addEventListener('message', (event) => {
    console.log('Message from server ', event.data);
});

//Here is my server codes
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 3000 })
wss.on('connection', function connection(ws) {
  console.log(`A ${ws.url}} connects`)
  ws.on('message', (evt) => {
     console.log(`on message:received: ${evt}`)
     ws.send('test callback')
  })
 })

但事实证明,控制台会立即打印出“来自服务器Hello World的消息”,而WS服务器没有获得该事件。
那么dispatchEvent()在WebSocket中有什么用呢?

dgsult0t

dgsult0t1#

EventTarget接口是由可以接收事件的对象实现的,它是ws(WebSocket)变量将实现的接口,用于从该网络套接字的低级浏览器实现接收通信事件(例如,当它成功打开时,以及当接收到消息时)。
但是,你不应该自己调用它,你所做的是手动地向它提供一个事件,并使WebSocket表现得好像它是一个从远程服务器到达的真实的事件。
因此,您的代码仅在模拟服务器响应的测试方案中有用。

相关问题