c # to Node.js - очистка буфера записи именованного канала не завершает поток - PullRequest
0 голосов
/ 23 сентября 2019

Я пишу два приложения для Windows (одно C # и одно Electron), которые взаимодействуют друг с другом по именованным каналам.Клиент c # должен отправить сообщение, а затем очистить, чтобы завершить это сообщение.Но NamedPipeClientStream не завершает потоки на стороне узла при очистке буфера:

// C# client
public class Client
{
    private NamedPipeClientStream _client;
    private StreamWriter _writer;

    public Client(string pipeName)
    {
        InitClient();
    }

    private void InitClient()
    {
        _client = new NamedPipeClientStream("myPipe");
        _writer = new StreamWriter(_client);
        _client.Connect();
    }

    public void SendMessage(string response)
    {
        _writer.Write(response);
        _writer.Flush();
    }
}

Это отправляет сообщения получателю Node.js:

// Node.js server
export class MessageHandler {
  private _pipePath;
  private _server: Server;
  private _stream: Socket;
  private _messageBuffer = "";

  constructor() {
    this._pipePath = "\\\\.\\pipe\\myPipe";
    this.initiateServer();
  }

  public initiateServer() {
    this._server = createServer({ allowHalfOpen: true }, (socket: Socket) => {
      this._stream = socket;

      this._stream.on("data", (buffer: Buffer) => {
        const message = buffer.toString();

        this._messageBuffer += message;
      });

      this._stream.on("end", () => {
        this.handleMessage();
      });
    });
  }

  private handleMessage() {
    ...
  }
}

Я думал, что очистка потока будетвызвать конец сообщения?

Что мне не хватает?Могу ли я вручную отправить конец потока от клиента C #, который я могу обнаружить на стороне узла?

Спасибо!

1 Ответ

0 голосов
/ 23 сентября 2019

Вам нужно Close ваши _writer и _client после использования, чтобы они могли выпустить.

Ваш SendMessage должен выглядеть так:

_writer.Write(response);
_writer.Flush();
_writer.Close();
_client.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...