【发布时间】: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