【问题标题】:SockJS multiple connection in single client单个客户端中的 SockJS 多个连接
【发布时间】:2020-03-25 10:38:33
【问题描述】:

我正在尝试从单个客户端连接多个套接字。问题是我的脚本每 2 秒初始化一次新连接,但 10 秒后(总共 5 个连接)这些连接尝试一起连接到套接字。我想要的是:

初始化连接 1-->
连接到套接字的连接 1-->
连接 1 监听消息-->

初始化连接 2-->
连接到套接字的连接 2-->
连接 2 监听消息-->

初始化连接 3-->
连接到套接字的连接 3-->
连接 3 监听消息-->

等等..我希望他们一一连接。但我做不到。

    'use strict'

    let stompClient
    class Socket{
        constructor(ip,ith) {  // Constructor
        this.ipAddress = ip;
        this.ith = ith;
        this.connected = false;
      }

    async connect(){
        const connect = (event) => {
        document.getElementById("insideText" + this.ith).innerHTML = "Connecting..";
        const socket = new SockJS('http://'+ this.ipAddress +':8081/server')
        stompClient = Stomp.over(socket)
        stompClient.connect({}, onConnected, onError)
        //event.preventDefault()
    }

    const onConnected = () => {
        stompClient.subscribe('/topic/public', onMessageReceived)
        stompClient.send("/app/chat.newUser",
            {},
            JSON.stringify({sender: "client", type: 'CONNECT'})
        )
    }

    const onError = (error) => {
        document.getElementById("insideText" + this.ith).innerHTML = "Connection failed!";
        document.getElementById("img" + this.ith).src = "Dead.png"
        //const status = document.querySelector('#status')
        //status.innerHTML = 'Could not find the connection you were looking for. Move along. Or, Refresh the page!'
        //status.style.color = 'red'
    }

    const onMessageReceived = (payload) => {
        const message = JSON.parse(payload.body);
        var date = new Date().getTime();
        var number = new Number(message.startTime);
        var difference = date - number;

        if(message.status === "BUSY"){
            document.getElementById("img" + this.ith).src = "Busy.png"
            document.getElementById("insideText" + this.ith).innerHTML = message.crawler + ", " + msToTime(difference);
        }
        if(message.status === "FREE"){
            document.getElementById("img" + this.ith).src = "Free.png"
            document.getElementById("insideText" + this.ith).innerHTML = message.crawler;
        }
    }

        connect();
    }
    }

    function msToTime(duration) {
      var milliseconds = parseInt((duration % 1000) / 100),
        seconds = Math.floor((duration / 1000) % 60),
        minutes = Math.floor((duration / (1000 * 60)) % 60),
        hours = Math.floor((duration / (1000 * 60 * 60)) % 24);

      hours = (hours < 10) ? "0" + hours : hours;
      minutes = (minutes < 10) ? "0" + minutes : minutes;
      seconds = (seconds < 10) ? "0" + seconds : seconds;

      return hours + ":" + minutes + ":" + seconds;
    }

    function sleep(ms) {
      var start = new Date().getTime(), expire = start + ms;
      while (new Date().getTime() < expire) { }
      return;
    }

    for (var i = 1; i < 6; i++) {
sleep(2000)
        if(i === 1){
            var socket = new Socket("10.10.10.43",i);
            socket.connect();
        }else if(i === 2){
            var socket = new Socket("10.10.10.43",i);
            socket.connect();
        }
        else if(i === 3){
            var socket = new Socket("10.10.10.43",i);
            socket.connect();
        }
        else if(i === 4){
            var socket = new Socket("10.10.10.43",i);
            socket.connect();
        }else{
            var socket = new Socket("10.10.10.43",i);
            socket.connect();   
        }

    }

【问题讨论】:

  • 需要澄清:在您想要的场景中,2 秒的等待时间应该在哪里。我猜每个连接都应该监听 2 秒然后移交给下一个?
  • @Codebreaker007 我在 for 循环的第一行底部添加了 sleep 方法。和连接();函数是异步的。我不完全确定我做了什么。因为我不是 JS 专家。可能存在逻辑问题。

标签: javascript html websocket sockjs


【解决方案1】:

场景:每个连接都应该监听 2 秒,然后移交给下一个

你现在要做的是用 2 秒的间隔初始化每个连接,然后...
当然,所有连接都会或多或少地同时检查传入数据。
所以你应该有一个例程,比如(如果这是你想要的)接收事件:

// Global part
socketInit = 0;
var socket1;
....
 var socket5;

 // on doc ready run once
 if(socketInit  == 0){
socketInit = 1;
for (var i = 1; i < 6; i++) {
    var socket = "socket"+i;
    var socket = new Socket("10.10.10.43",i);
    socket.connect();
     sleep(2000);// if you need this here already
    }
 } // end run once

 // on doc ready run contiously
  for (var i = 1; i < 6; i++) {
  socketAction (i);   
  sleep(2000);
   }

// Function to be called
function action(socketNum) {
        var socket = "socket" + socketNum;
        if(socket.data != null) {   //I dont know your lib so replace it with the appropriate data receive event/ indicator
   .... do something ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-10-27
    • 2015-10-27
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多