C# 管道通信-命名管道(一)

        最近在做一个应用程序,涉及到两个应用程序之间的通讯,就想到了用C#的命名管道的方式来实现,经过一番小折腾,总算实现了,现把一些主体的代码粘贴出来与大家分享:

        管道通讯会涉及到client端和Server端,Client端的主要代码:

        需要引用命名空间:using System.IO.Pipes;

Thread pipeThread = new Thread(new ThreadStart(SendData));
pipeThread.IsBackground = true;
pipeThread.Start();

private void SendData()
{
	try
	{
		_pipeClient = new NamedPipeClientStream(".","closePipe", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);
		_pipeClient.Connect();
		StreamWriter sw = new StreamWriter(_pipeClient);
		sw.WriteLine("Exit");
		sw.Flush();
		Thread.Sleep(1000);
		sw.Close();
	}
	catch (Exception ex)
	{
		Log.WriteLog(ex.Message);
	}
}

        Sever端的代码:

Thread receiveDataThread = new Thread(new ThreadStart(ReceiveDataFromClient));
receiveDataThread.IsBackground = true;
receiveDataThread.Start();

private void ReceiveDataFromClient()
{
	while (true)
	{
		try
		{
			_pipeServer = new NamedPipeServerStream("closePipe", PipeDirection.InOut, 2);
			_pipeServer.WaitForConnection(); //Waiting
			StreamReader sr = new StreamReader(_pipeServer);
			string recData = sr.ReadLine();
			if (recData == "Exit")
			{
				Log.WriteLog("Pipe Exit.", _logFile);

				ExitApplication();
			}
			Thread.Sleep(1000);
			sr.Close();
		}
		catch (Exception ex)
		{
			Log.WriteLog(ex.Message, _logFile);
		}
	}
}

        这个例子只是Client与Sever端连接之后,给server端发消息,使其关闭的简单功能,也可以进行消息的回传。

        这里需要注意的是,开启管道监听和管道连接最好是在线程中处理,否则主程序会卡死(No Responding)。

        还有就是线程要设置为后台线程,否则程序退出后,在任务管理器中还会存在,不能完全退出。


管道介绍:

        管道是一段被进程用来通讯的共享内存。创建pipe的进程称为服务端,连接到一个管道的进程叫做客户端。一个进程向管道中写入信息,接着另外一个进程读出其中数据。 
        关于管道有命名和匿名两种管道,相比之下匿名管道所需开销较小。这里用管道这个名词表明它是一个信息通道,概念上来说,一个管道连接两端。单向管道允许一端写另一段读,双向管道允许一个进程既可以读又可以向管道写数据。

1. 匿名管道:
        匿名管道是个没有名字的单向管道,用来在父进程和子进程间传输数据。匿名管道总是在本机使用的,不可以用在网络上进行通讯。
winodws NT/2000 以后的系统:匿名管道通过使用唯一名字的命名管道来实现。因此,你可以将匿名管道的句柄作为参数传递给需要命名管道句柄的函数。

2. 命名管道:
        命名管道是一个有名字,单向或者双向的,用在服务端和一个或多个客户端进行通讯。一个命名管道的所有实例共享同样的管道名,但是每个实例都有各自的缓存和句柄,作为一个隔离的通道,让客户端-服务器端进行通讯,这些实例允许客户端同时使用相同名字的管道。

        任何进程可以访问命名管道,需要进行安全检查,使得管道为相关或者不相关进程通讯提供了一种简单的方式。命名管道可以用在同一台计算机或者网络计算机之间的进程间通讯。任何进程既可以作为服务端又可作为客户端,使得段对段通讯成为可能。这里服务端的意思是创建了一个命名管道的进程,客户端是连接到命名管道实例的进程。

 

        更多例子请参考:http://msdn.microsoft.com/zh-cn/library/bb546085(v=vs.90)

 


 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值