【问题标题】:How to send a message to everyone execpt the sender socket.io如何向除发件人 socket.io 之外的所有人发送消息
【发布时间】:2021-05-14 13:14:17
【问题描述】:

我知道要做这样的事情我们必须写 socket.broadcast.emit('chat message', 'hello guy') 但就我而言,当我这样做时,什么也没有发生,我仍然在浏览器中收到消息。 据我了解,如果我从浏览器发送消息,socket.broadcast 会以这种方式工作,我一定看不到它,但我确实看到了。

io.on('connection', (socket) => {
  console.log('a user connected');
  socket.broadcast.emit("hello", "world");


  socket.on('chat message', (msg) => {
    console.log('message: ' + msg);
    socket.emit("chat message", msg)
    socket.broadcast.emit("chat message", msg) <=== doesn't work
  });

  socket.on('typing', (data) => {
    io.emit('typing', data)
  })

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });
});

反应

import {useEffect, useState} from "react";
import {io} from "socket.io-client";
import {Button, ChatField, ChatFieldArea, Input, Wrapper} from "./styled/appstyled";


function App() {
  const [message, setMessage] = useState("")
  const [messageList, setMessageList] = useState([])
  const [typing, setTyping] = useState(false)


  const ENDPOINT = "ws://localhost:4444";
  const socket = io(ENDPOINT, {transports: ['websocket']});

  let typingTimer;

  useEffect(() => {
    socket.on("chat message", (data) => {
      setMessageList(p => [...p, data])
    })

    socket.on("typing", (data) => {
      setTyping(data)
    })

    return ()=>{
      socket.disconnect();
    }

  }, [])

  const handleSubmit = (e) => {
    e.preventDefault()
    if (message.length > 0) {
      socket.emit('chat message', message);
      socket.emit('typing', false)
      setTyping(false)
      setMessage("")
    }
  }

  return (
      <h1>
        <form onSubmit={handleSubmit}>
          <ChatFieldArea>
            <ChatField>
              {messageList.map((el, i) => {
                return (
                    <span key={i}>{el}</span>
                )
              })}
            </ChatField>
            <Wrapper>
              <Input onChange={(e) => {
                if (e.target.value.length > 0) {
                  setMessage(e.target.value)
                }
              }} value={message}
                     onKeyDown={(e) => {
                       if (e.key !== 'Enter') {
                         setTyping(true)
                         socket.emit('typing', true)
                         clearTimeout(typingTimer)
                       }
                     }}
                     onKeyUp={() => {
                       clearTimeout(typingTimer)
                       typingTimer = setTimeout(() => {
                         socket.emit('typing', false)
                         setTyping(false)
                       }, 1000);

                     }}/>
              <Button type={"submit"}>Click</Button>
            </Wrapper>
            {typing ? "typing" : 'not typing'}

          </ChatFieldArea>
        </form>
      </h1>
  );
}

export default App;

【问题讨论】:

    标签: reactjs express websocket socket.io


    【解决方案1】:

    这是因为您同时使用了socket.emitsocket.broadcast.emit。如果您只想向发件人以外的用户发送消息,请删除socket.emit call

    socket.emit - 向发件人发送消息

    socket.broadcast.emit - 向除发件人以外的所有人发送消息

    所以你应该更新你的代码:

    socket.on('chat message', (msg) => {
        console.log('message: ' + msg);
       // socket.emit("chat message", msg)  REMOVE THIS
        socket.broadcast.emit("chat message", msg) // WILL send to everyone except sender
    });
    

    【讨论】:

    • 它不起作用,我尝试了两种方式,但是 socket.broadcast.emit("chat message", msg) 不起作用,它会向所有用户和我发送文本
    猜你喜欢
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2016-06-02
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多