Как я могу подключить WebSocket, слушающий один порт, к сокету Net, слушающему другой, используя NodeJS? - PullRequest
0 голосов
/ 18 июня 2020

Это подход, который я пробовал, но не работал. Я могу пересылать входящие сообщения из соединения WebSocket в NetSocket, но только первое сообщение, полученное NetSocket, приходит клиенту за WebSocket.

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

const NetSocket = require('net');
const net = new NetSocket.Socket();

// Web socket
wss.on('connection', function connection(ws) {
    console.log((new Date()) + ' Remote connection accepted ' + ws.remoteAddress);
    ws.on('message', function incoming(message) {
        console.log('Received from remote: %s', message);
        net.write(message)
    });

    ws.on('close', function(){
        console.log((new Date()) + ' Remote connection closed');
    });
});


// Net socket
net.connect(8745, '127.0.0.1', function() {
    console.log((new Date()) + ' Local connection accepted');
});

net.on('data', function(data) {
    console.log('Received from local: ' + data);
    // Iterate the connected devices to send the broadcast
    wss.clients.forEach(function each(c) {
        if (c.readyState === WebSocket.OPEN) {
          c.send(data);
        }
    });
});

net.on('close', function() {
    console.log('Local connection closed');
});

1 Ответ

0 голосов
/ 19 июня 2020

После нового исследования я заметил, что проблема была в моем быстром коде.

private func setReceiveHandler() {
  webSocketTask.receive { result in
    defer { self.setReceiveHandler() } // I was missing this line
    do {
      let message = try result.get()
      switch message {
      case let .string(text):
        print("Received text message: \(text)")
      case let .data(data):

Итак, просто добавив defer {self.setReceiveHandler ()} к моей функции, он начал работать.

Обратите внимание на оператор defer в начале обработчика приема. Он вызывает self.setReceiveHandler (), чтобы сбросить обработчик приема в соединении с сокетом, чтобы он мог получить следующее сообщение. В настоящее время обработчик приема, который вы устанавливаете для сокет-соединения, вызывается только один раз, а не каждый раз при получении сообщения. Используя оператор defer, вы убедитесь, что self.setReceiveHandler всегда вызывается перед выходом из области действия обработчика приема, что гарантирует, что вы всегда получите следующее сообщение от вашего сокет-соединения.

I получил информацию от:

https://www.donnywals.com/real-time-data-exchange-using-web-sockets-in-ios-13/

...