Socket IO сохраняет (пере?) Соединение даже после установки websocket - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь реализовать веб-сокеты. Ему удается установить соединение и печатать Backend, connected! и Frontend, connected!, но когда я набираю текст на вводе и нажимаю отправить, он просто печатает Frontend, connected! еще несколько раз, и ничего не происходит. Что я здесь не так делаю?

Вот что у меня есть:

// server.js
const express = require("express");

const app = express();

app.use("/api/messages", require("./routes/api/messages"));

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => console.log(`Listening on port ${PORT}`));
// routes/api/messages.js
const express = require("express");

const router = express.Router();

const server = require("http").createServer();

const io = require("socket.io")(server, {
  path: "/socket",
  serveClient: false,
  pingInterval: 10000,
  pingTimeout: 5000,
  cookie: false
});

io.on("connection", () => {
  console.log("Backend, connected!");
});

io.on("msg", function(msg) {
  console.log("entered!"); // <--- never prints!
  console.log("message: " + msg);
});

server.listen(5001);

router.post(...)

router.get(...)

module.exports = router;

И на моем внешнем интерфейсе React, на одном из моих экранов в React Navigation:

const Conversation = ({
  navigation,
  auth: { user },
  sendMessage
}) => {
  const [replyText, setReplyText] = useState("");

  const socket = io("http://192.168.112.110:5001", {
    path: "/socket",
    transports: ["websocket"],
    jsonp: false
  });

  useEffect(() => {
    socket.connect();

    socket.on("connect", () => {
      console.log("Frontend, connected!");
    });

    socket.on("works?", () => {
      console.log("omg");
    });

    socket.on("connect_error", err => {
      console.log("error", err);
    });
  }, []);

  const handleSendReply = () => {
    if (validateLength(replyText) === 0) {
      setReplyTooShort(true);

      return;
    }

    sendMessage(
      replyText,
      user.username
    );

    console.log("replyText", replyText); // prints

    socket.emit("msg", replyText);

    setReplyText("");
  };

return <View>
        <Input
        label="reply"
        value={replyText}
        onChangeText={e => setReplyText(e)}
        />
        <View style={{ alignItems: "flex-end" }}>
        <Icon
            name="md-send"
            type="ionicon"
            iconStyle={{ paddingLeft: 20, paddingRight: 20, paddingTop: 10 }}
            onPress={() => handleSendReply()}
        />
        </View>
    </View>
}

"socket.io": "^ 2.3.0" // server

"socket.io-client": "^ 2.3.0" // client


Редактировать:

(Желтое предупреждение следует игнорировать согласно этого комментария )

img

1 Ответ

1 голос
/ 14 октября 2019

Сокет-сервер прослушивает событие подключения.
При успешном соединении создается новый объект сокета с уникальным идентификатором.
Этот объект Socket обрабатывает отправку и получение событий / данных.


io.on("connection", (socket) => { 
  // console.log("Backend, connected!"); // user or client is connected.
  console.log("User connected with a unique socketId ", socket.id);
    socket.on("msg", function (msg) {
        console.log("entered!"); // <--- It will print now !
        console.log("message: " + msg);
    });

});

Документация Socket-io

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...