提问者:小点点

无法使用带有NodeJS,ReactJS和Express的Socket.IO在服务器和客户端之间建立连接


我读过博客和看过视频,在这些博客和视频中,服务器和客户机之间的连接是成功的,但由于某种原因,它似乎在我的系统上并不起作用。

这是服务器端的代码:

const app = require('express')();
const http = require('http').createServer(app);
const io = require('socket.io')(http);
const PORT = 3001;

io.on('connection', socket => {
    console.log('a user connected.');
});

http.listen(PORT, () => {
    console.log('listening on port ' + PORT);
});

这是客户端的代码:

import React, { useEffect } from 'react';
import io from 'socket.io-client';
const socket = io('http://127.0.0.1:3001');

function Test() {

    return (
        <div>
            Test
        </div>
    )
}

export default Test;
    而不是仅使用

谢谢你所有的帮助!


共2个答案

匿名用户

您可以尝试将套接字包装在中。大概是这样的:

import React, { useState, useEffect } from "react";
import socketIOClient from "socket.io-client";
const ENDPOINT = "http://127.0.0.1:3001";

function App() {
  const [response, setResponse] = useState("");

  useEffect(() => {
    const socket = socketIOClient(ENDPOINT);
    socket.on("FromAPI", data => {
      setResponse(data);
    });
  }, []);

  return (
    <p>
      {response}
    </p>
  );
}

export default App;

在服务器中,您需要指定要发出的事件:

socket.emit("FromAPI", "Hello Socket!");

匿名用户

请在服务器端使用ws模块:

服务器端。。。

const WebSocketServer = require("ws").Server,
    express = require("express"),
    http = require("http"),
    app = express(),
    server = http.createServer(app);

const bodyParser = require("body-parser");
const cors = require('cors')
require('dotenv').config();

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

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

require("./app/routes/routes.js")(app);

// set port, listen for requests
server.listen(port, () => {
  console.log(`Server is running on port ${port}.`);
});


var wss = new WebSocketServer({server: server, path: '/getall'});
const sql = require("./app/models/db.js");

wss.on("connection", function(ws){
  ws.on('message', function incoming(message) {
    if (message) {
        ws.send(JSON.stringify(message));
    } else {
      ws.send("{}");
    }
  });
});

客户端。。。

<script>
var wsurl  = "ws://localhost:5000";
var Socket = new WebSocket(wsurl + "/getall");

Socket.onopen = function() {
    Socket.send("get all tags");      
};

Socket.onmessage = function (evt) { 
        var received_msg = evt.data;
        // console.log(received_msg);
        var tags = JSON.parse(received_msg);
        self.tags = tags;
};

</script>

客户端不需要任何节点模块。新的WebSocket(path)原本可以不在浏览器上使用任何模块。