如何在页面刷新后从socket.io重新连接socket示例?

h7appiyu  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(510)

试图用express+socket.io制作一个简单的聊天应用程序并做出React,但这个问题一直折磨着我的大脑。每当我刷新消息应用程序路由上的页面时,我都无法发送任何消息。我试图通过使用带有历史api的react路由器将我发送回主页来规避这个问题。但是,当我返回主页时,我无法重新进入聊天页面,除非我再次刷新主页。每当我刷新页面时,套接字对象似乎都是空的。
服务器代码:

  1. const room = "general";
  2. const room2 = "memes";
  3. const LOGIN = "loginEvent";
  4. const NEW_MESSAGE_EVENT = "newMessageEvent";
  5. const LEAVE_EVENT = "leaveEvent";
  6. io.on("connection", (socket) => {
  7. socket.on(LOGIN, ({ nickname, room }, callback) => {
  8. const user = addUser(socket.id, nickname, room);
  9. socket.join(user.room);
  10. callback();
  11. // socket.emit()
  12. });
  13. socket.on(NEW_MESSAGE_EVENT, (data) => {
  14. console.log(data);
  15. io.in(room).emit(NEW_MESSAGE_EVENT, data);
  16. });
  17. socket.on("disconnect", () => {
  18. const deletedUser = delUser(socket.id);
  19. console.log("User deleted:", deletedUser);
  20. if (deletedUser) {
  21. io.in(room).emit(LEAVE_EVENT, {
  22. notification: `User ${deletedUser.nickname} has just left`,
  23. });
  24. }
  25. socket.leave(room);
  26. });
  27. });

在客户端中,我使用react上下文api存储套接字对象,如下所示:

  1. import React, { createContext } from "react";
  2. import io from "socket.io-client";
  3. const SocketContext = createContext();
  4. const SocketProvider = ({ children }) => {
  5. const ENDPOINT = "http://localhost:3030";
  6. const socket = io(ENDPOINT);
  7. return (
  8. <SocketContext.Provider value={socket}>
  9. {children}
  10. </SocketContext.Provider>
  11. );
  12. };
  13. export { SocketContext, SocketProvider };

然后,我创建一个钩子来发送消息:

  1. import { useState, useContext, useEffect } from "react";
  2. import { SocketContext } from "../contexts/socketContext";
  3. const NEW_MESSAGE_EVENT = "newMessageEvent";
  4. const useRoom = () => {
  5. const socket = useContext(SocketContext);
  6. const [messages, setMessages] = useState([]);
  7. useEffect(() => {
  8. socket.on(NEW_MESSAGE_EVENT, (message) => {
  9. const incomingMessage = {
  10. ...message,
  11. isOwner: message.id === socket.id,
  12. };
  13. setMessages((messages) => [...messages, incomingMessage]);
  14. });
  15. return () => {
  16. socket.close();
  17. };
  18. }, [socket]);
  19. const sendMessage = (message) => {
  20. socket.emit(NEW_MESSAGE_EVENT, { body: message, id: socket.id });
  21. };
  22. return { messages, sendMessage };
  23. };
  24. export default useRoom;

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题