c# 管道通信-命名管道(二)

命名管道的连接总结:

       命名管道的连接有两次阻塞的地方,一是在WaitForConnection()时[客户端进行连接同理]会阻塞,二是在ReadString()[读取管道信息]时。

       在服务器端第一次创建命名管道后等待连接,当客户端连接成功后服务器端的命名管道就用作通讯用途。如果需要再次等待连接,服务器端就需要再次打开命名管道(创建一个命名管道的实例)并等待连接。

        对于客户端每次打开命名管道后建立与服务器间的连接,然后就可以利用命名管道进行通信,如果需要建立第二个连接则需要再次打开管道和再次建立连接。

       创建命名管道时需要指定一个主机名和管道名,在同一主机上管道名称是唯一的,一个命名管道一旦被创建就不允许相同名称的管道再被创建。

        请注意关闭管道和关闭连接是不同的意思,在同一个管道上可以依次反复建立连接,而且可以减小系统的负荷。而且如果指定了管道最大数量限制那么在打开的管道达到最大限制后如果不关闭旧管道就无法打开新管道。 对于客户方则无法关闭连接,而只能直接调用Close()关闭管道。如果客户端调用了close()关闭了管道,那么再次连接服务器端的原管道就不可以了,服务端的管道也需要重新进行初始化并且等待连接。

关于双向通信:

      上篇文章中提到了管道可以进行双向通信,双向通信实际上就是服务端模拟客户端回发消息,客户端进行接收的过程,主要是调用了pipeServer.RunAsClient(StartListening),StartListening是一个回调方法,里面可以写回发的消息。而客户端就进行Read就可以了,具体代码为:

客户端主要代码:

NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", _pipeName, PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);
pipeClient.Connect();

while (true)
{
	//Write
	string sRequest = "request";
	StreamString ss = new StreamString(pipeClient);
	ss.WriteString(sRequest);

	//Read
	string sResult = ss.ReadString();
	if (sResult != "")
	{
		//
	}
}


服务端主要代码:

NamedPipeServerStream pipeServer = new NamedPipeServerStream(_pipeName, PipeDirection.InOut, 1);
pipeServer.WaitForConnection();

try
{
	_ss = new StreamString(pipeServer);
	string sResult = _ss.ReadString();
	if ( sResult != "")
	{
		pipeServer.RunAsClient(StartListening);
	}
}
catch (IOException ex)
{
}
				
private void StartListening()
{
	//Return result message
	string sResult = "request";
	_ss.WriteString(sResult);
}


       因本人的程序包含一些复杂的逻辑处理,只是贴出来部分主干代码,代吗不能直接运行,希望博友理解含义后自行实践。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,你的问题是关于 C# 管道通信中的命名管道,我会为你进行解答。 首先,命名管道是一种在本地计算机或网络上进行进程间通信的机制。它允许一个进程向另一个进程发送数据或接收数据。在 C# 中,我们可以使用命名管道来实现进程间通信。 在使用命名管道之前,我们需要先创建一个命名管道。可以使用 .NET Framework 中的 `NamedPipeServerStream` 类来创建一个命名管道。以下是创建命名管道的代码示例: ```csharp // 创建命名管道 NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut); ``` 上面的代码将创建一个名为 "testpipe" 的命名管道,并指定了管道的方向为双向。 接下来,我们可以使用 `NamedPipeServerStream` 类的 `WaitForConnection` 方法等待客户端连接到管道。一旦有客户端连接,我们就可以使用 `NamedPipeServerStream` 类的 `Read` 和 `Write` 方法来进行数据的读。 以下是一个简单的命名管道通信示例: ```csharp // 创建命名管道 NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut); // 等待客户端连接 pipeServer.WaitForConnection(); // 从客户端读取数据 byte[] buffer = new byte[1024]; int bytesRead = pipeServer.Read(buffer, 0, buffer.Length); string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("Received data: " + data); // 向客户端发送数据 string response = "Hello, client!"; byte[] responseBuffer = Encoding.UTF8.GetBytes(response); pipeServer.Write(responseBuffer, 0, responseBuffer.Length); // 关闭管道 pipeServer.Close(); ``` 在上面的代码中,我们首先创建了一个名为 "testpipe" 的命名管道。然后,我们使用 `WaitForConnection` 方法等待客户端连接,并读取客户端发送的数据。接着,我们向客户端发送响应数据,并关闭管道。 总的来说,使用命名管道可以很方便地实现进程间通信。在实际应用中,我们可以根据需要对命名管道进行配置,以实现更复杂的通信逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值