Узел TCP-клиент: запись возвращает true, даже если совпадение наполовину открыто - PullRequest
0 голосов
/ 17 декабря 2018

Я использую node net для создания простого серверного / клиентского приложения, которое отправляет и получает сообщения.

Однако при тестировании приложения я обнаружил, что когда соединение наполовину открыто (т.е. я закрываю Wi-Fi для сервера), клиент продолжает писать (это интервал) и возвращает истину, и ошибка никогда не возникает!

Пример кода службы:

import * as net from "net";
export class TcpService {
  private client;
  public isConnected: boolean = false;

  constructor(port: number, ip: string, cb: Function) {
    this.client = net.createConnection(
      { port, host: ip, allowHalfOpen: false },
      () => {
        console.log("TCP Connected");
        this.client.setKeepAlive(true, 10000);

        this.isConnected = true;
        cb();
      }
    );
  }

  onReceiveMsg(cb) {
    this.client.on("data", msg => {
      cb(msg);
    });
  }

  write(msg, encoding?: string, cb?: Function) {
    return this.client.write(msg, encoding => {
      if (cb) {
        cb();
      }
      console.log("WRITTEN", this.client.bytesWritten);
    });
  }

  onClose(cb) {
    this.client.on("close", () => {
      this.isConnected = false;
      console.log("TCP Connection closed");
      cb();
    });
  }

  onError(cb) {
    this.client.on("error", err => {
      console.log("TCP Err", err);
      this.isConnected = false;
      cb(err);
    });
  }

  sendHeartBeat() {
    return this.write(".\n");
  }
}

КлиентОбразец:

import { TcpService } from "./app/services/tcp.service";
import { ip, port, heartBeatFrequency } from "./app/config/tcp.config";

const onTCPConnected = () => {

  // Init HeartBeat
  const sendHeartBeat = () => {
    if (tcpService.isConnected) {
      console.log("Heart Beat: ", tcpService.sendHeartBeat());
    } else {
      clearInterval(heartBeatInterval);
      console.log("Connection Dropped");
    }
  };
  const heartBeatInterval = setInterval(sendHeartBeat, heartBeatFrequency);
};

const tcpService = new TcpService(port, ip, onTCPConnected);

tcpService.onError(err => {
  console.log("TCP CONNECTION ERROR:", err);
});

tcpService.onClose(() => {
  console.log("TCP CONNECTION CLOSED");
});
...