【问题标题】:c# to Node.js - Flushing named pipe write buffer does not end streamc# 到 Node.js - 刷新命名管道写入缓冲区不会结束流
【发布时间】:2020-01-23 14:00:23
【问题描述】:

我正在编写两个使用命名管道相互通信的 Windows 应用程序(一个 C# 和一个 Electron)。 c# 客户端应发送消息,然后刷新以结束该消息。但是 NamedPipeClientStream 在刷新缓冲区时不会在 Node 端结束流:

// 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# 客户端手动向流发送结束,我可以在 Node 端检测到吗?

谢谢!

【问题讨论】:

  • 没有。仅关闭文件。

标签: c# node.js stream named-pipes


【解决方案1】:

你需要在使用后Close你的_writer_client,以便他们释放。

您的SendMessage 应该如下所示:

_writer.Write(response);
_writer.Flush();
_writer.Close();
_client.Close();

【讨论】:

  • 这就是我所害怕的......那么这是否意味着我必须为每条消息运行 InitClient() ?
  • @mottosson 遗憾的是,至少据我所知,您将不得不这样做。作家只会在关闭时释放。虽然我对管道不太确定......也许它会自动关闭,也许它会保持打开状态......跟踪和错误
  • @mottosson 一条建议。尝试将发送与消息输入分离。这将保护您以后的大量工作,并防止服务垃圾邮件。而是创建一个每隔一两秒运行一次的服务,它只会推送它收集的所有消息(如果有的话)。
  • 我最终得到了一个用于 NamedPipeClientStream 和 StreamReader/StreamWriter 的 using 语句,用于处理读取和写入流的两种方法。至于消息缓冲区,我的应用程序一次不会发送超过一条消息并听取响应。但这是一个好主意,下次可能更适用时,我会记住它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多