Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#to Node.js-刷新命名管道写入缓冲区不会结束流_C#_Node.js_Stream_Named Pipes - Fatal编程技术网

c#to Node.js-刷新命名管道写入缓冲区不会结束流

c#to Node.js-刷新命名管道写入缓冲区不会结束流,c#,node.js,stream,named-pipes,C#,Node.js,Stream,Named Pipes,我正在编写两个Windows应用程序(一个C#和一个Electron),它们使用命名管道相互通信。c#client应该发送消息,然后刷新以结束该消息。但在刷新缓冲区时,NamedPipeClientStream不会结束节点端的流: // C# client public class Client { private NamedPipeClientStream _client; private StreamWriter _writer; public Client(str

我正在编写两个Windows应用程序(一个C#和一个Electron),它们使用命名管道相互通信。c#client应该发送消息,然后刷新以结束该消息。但在刷新缓冲区时,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#客户端向流发送一个可以在节点端检测到的结束吗


谢谢

使用后,您需要
关闭
您的
\u writer
\u client
,以便释放它们

您的
SendMessage
应该是这样的:

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

不,只是关闭文件。这就是我害怕的。。。那么,这是否意味着我必须为每条消息运行InitClient()。@mottosson很遗憾,至少据我所知,你必须这样做。写入程序仅在关闭时释放。虽然我对管道不是很确定。。。也许它会自动关闭,也许它会一直打开。。。跟踪和error@mottosson一条忠告。尝试将发送与中的消息分离。这将为您以后的大量工作提供安全保障,并防止服务垃圾邮件。相反,创建一个每一秒或两秒运行一次的服务,它只会推出它收集的所有消息(如果有的话)。最后,我为NamedPipeClientStream和StreamReader/StreamWriter创建了一个using语句,用于处理流的读写的两个方法。至于消息缓冲区,我的应用程序一次不会发送超过一条消息并侦听响应。但这是一个好主意,我会在下次可能更适用时记住它。谢谢