websocket 未在节点js中建立套接字io连接

rekjcdws  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(160)

我正在节点js中编写服务器客户端应用程序。不幸的是,套接字io连接没有建立。
我的服务器端代码如下。
文件名:我的服务器. js

function MyServer(selectClient)
{ 
    var express    = require('express');
    var bodyParser = require("body-parser");
    this.app       = express();
    this.app.use(bodyParser.urlencoded({ extended: false }));
    this.app.use(bodyParser.json());

    var cookieParser = require('cookie-parser')
    this.app.use(cookieParser())
    if (undefined == selectClient)
    {
        selectClient = "default";
    }
    this.setStaticRoute("client/" + selectClient);
    this.client = selectClient;
};
MyServer.prototype.setStaticRoute = function (staticPath)
{
    var express = require('express');
    var path = require('path');
    this.app.use(express.static(staticPath));
};
MyServer.prototype.listen = function (portNumber)
{
    this.server = this.app.listen(portNumber, '127.0.0.1', function ()
    {
        var MyServerSocketIo = require('MyServerSocketIo');
        this.socketLink = new MyServerSocketIo(this.server,this.onDisconnect.bind(this),
            this.onError.bind(this),this.onConnection.bind(this));
      console.log("Inside listen function");
    }.bind(this));
};
MyServer.prototype.onDisconnect = function()
{
    console.log('On Socket IO Disconnect for MyServer');
};

MyServer.prototype.onError = function()
{
    console.log('On Error');
};
MyServer.prototype.onConnection = function()
{
   console.log('On Connection');
};

和MyServerSocketIo.js的代码如下所示

function MyServerSocketIo(server,onDisconnectCB,onErrorCB,onConnectionCB)
{
    var SocketIo    = require('socket.io');
    this.onDisconnectCB = onDisconnectCB;
    this.onErrorCB =  onErrorCB;
    this.onConnectionCB = onConnectionCB;
    this.socket = null;
    this.socketio = SocketIo(server);
    this.socketio.on('connection',this.onConnection.bind(this));  
};

MyServerSocketIo.prototype.onDisconnect =  function ()
{
    console.log('MyServer SocketIO Client Disconnected');
    this.onDisconnectCB();
};

MyServerSocketIo.prototype.onError =  function (error)
{
    console.log('MyServer SocketIO Connection error' + error);
    this.onErrorCB();
};

MyServerSocketIo.prototype.onConnection =  function (socket)
{
    console.log('MyServer SocketIO Connection with Client ID '+ socket.id + ' Established');
    this.socket = socket;
    socket.on('disconnect', this.onDisconnect.bind(this));
    socket.on('error',this.onError.bind(this));
    this.onConnectionCB();
};

下面是我的客户端代码
文件名:index.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8">
    <title>visual Display</title>
    <link rel="preload" href="css/visual.css" as="style">

    <link rel="stylesheet" href="css/visual.css">
    <script type="text/javascript" src="/socket.io/socket.io.js"></script>
    <script type="text/javascript" src="js/jquery-3.3.1.js"></script>
    <script type="text/javascript" src="js/MyClientSocketIo.js"></script>
    <script type="text/javascript" src="js/display.js"></script>
    <script type="text/javascript" charset="utf-8">

     display = new Display();

        function OnDisconnect()
        {
           display.showError();
        } 

        function OnError()
        {
           display.showError();
        }
        clientSocket = io.connect('http://localhost:39198', {
            transports: ['websocket'],
            'forceNew': true,
            rejectUnauthorized: false,
            reconnection: true,
            reconnectionDelay: 1000,
            reconnectionDelayMax : 1000,
            reconnectionAttempts: 99999
        });

        var socketClient = new MyClientSocketIo(clientSocket,OnDisconnect,OnError);
    </script>
</head>
<body>
</body>
</html>

MyClientSocketIo.js文件代码如下

function MyClientSocketIo(client,onDisconnectCB,onErrorCB)
{
    this.onDisconnectCB = onDisconnectCB;
    this.onErrorCB = onErrorCB;
    this.client = client;
    this.client.on('connect',this.onConnection.bind(this));
};

MyClientSocketIo.prototype.onDisconnect =  function ()
{
    console.log('MyClient Disconnected');
    this.onDisconnectCB();
};

MyClientSocketIo.prototype.onError =  function (error)
{
    console.log('MyClient ' + this.client.id + ' encountered Error ' + error);
    this.onErrorCB();
};

MyClientSocketIo.prototype.onConnection =  function ()
{
    console.log('MyClient ' + this.client.id + ' connected to MyServer over SocketIO !!');
    this.client.on('disconnect', this.onDisconnect.bind(this));
    this.client.on('error',this.onError.bind(this));
};

我可以看到服务器和客户端正在启动,并且在控制台日志下面也打印了“Inside listen function”,即MyServer.prototype.listen函数。但是服务器和客户端之间的socketIO连接没有建立。我看不到MyServerSocketIo.prototype.onConnection函数中的控制台日志行。我正在等待30秒的socketio连接。如果未建立,则重新启动服务器和客户端,并且在重新启动后也未建立socketio连接。

jw5wzhpr

jw5wzhpr1#

这是我个人的工作聊天脚本。我用nodejs,axios和socket做过代码。
您也可以使用此脚本。
后端服务器

require("dotenv").config();
const port = process.env.SOCKET_PORT || 3000;
const main_server_url = process.env.SERVER_URL;
var express = require("express");
var app = express();
var server = app.listen(port);
var connectionOptions = {
  "force new connection": true,
  "reconnection": true,
  "reconnectionDelay": 2000,                  //starts with 2 secs delay, then 4, 6, 8, until 60 where it stays forever until it reconnects
  "reconnectionDelayMax": 60000,              //1 minute maximum delay between connections
  "reconnectionAttempts": "Infinity",         //to prevent dead clients, having the user to having to manually reconnect after a server restart.
  "timeout": 10000,                           //before connect_error and connect_timeout are emitted.
  "transports": ["websocket"]                 //forces the transport to be only websocket. Server needs to be setup as well/
}
var io = require("socket.io").listen(server, connectionOptions);
var axios = require("axios");

var users = [];
var connections = [];

console.log("Server connected done");

io.sockets.on("connection", function (socket) {
  var server_url = main_server_url;
  console.log(server_url);

  console.log(people);
  connections.push(socket);
  console.log("Connected : total connections are " + connections.length);

  // rest of events of socket
});

用于客户端加载IO的前端JS

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>

<script type="text/javascript">
    var base_url = YOUR_BASE_URL;
    var port = YOUR_SOCKET_PORT;
    var socket_port_url = base_url + ":" + port;
    var socket = io(socket_port_url);
    socket.on('done', (data) => {
        console.log(data);
    });
</script>

相关问题