分享
 
 
 

跨机器使用命名管道

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

创建命名管道命名管道常常用于应用程序之间的通迅,由于不需要进行序列化和反序列化操作,效率是非常高的。相比TCP通信方式,效率更高,但比共享内存要低点。

命名管道可以在本地机器或者局域网内机器实现进程间通信,所以是最佳的通信方式。

创建一个NamedPipeServerStream:

NamedPipeServerStream pipeServer =newNamedPipeServerStream(_pipName, PipeDirection.InOut,10);

这里表示命名管道服务器的管道放心为双向通信,类似于TCP双工。接着,使用下面的代码等待连接:

pipeServer.WaitForConnection();

如果有连接,就可以使用流阅读器进行阅读:

StreamReader sr =newStreamReader(pipeServer);

同样,也可以使用流写操作器,将数据写入流,管道的另一端,可以读取这个流:

using(StreamWriter sw =newStreamWriter(pipeServer))

{

sw.AutoFlush=true;

sw.WriteLine("hello world"+str);

}

注意:此处使用了using,意味着写完就会关闭流,但同时也会关闭管道,所以需要注意。假如客户端要读取全部数据,那么需要等到这里关闭流。

自定义应用层通信协议如何读取管道的全部数据,看下面的代码:

StreamReader sr =newStreamReader(pipeServer);stringtext =sr.ReadToEnd();

这种方式可以读取全部数据,但是,在管道的另外一段,如果留写操作器不调用 Close方法,这里没法读取完成,程序会阻塞在这里。 所以,必须定义一个“应用协议”,客户端告诉服务端合适结束读取数据。

我们仿照HTTP协议的方法,使用连续的2个以上的回车换行表示HTTP头信息结束,我们也这样定义,并附加其它标记来表示流数据发送完毕,参考发送端:

publicstringQuery(stringrequest)

{if(!_pipeClient.IsConnected)

{

_pipeClient.Connect(10000);

}

StreamWriter sw=newStreamWriter(_pipeClient);

sw.WriteLine(request);

sw.WriteLine();//连续2个换行外加"#END"表示结束sw.WriteLine();

sw.WriteLine("#END");

sw.Flush();

StreamReader sr=newStreamReader(_pipeClient);stringreturnVal =sr.ReadToEnd();returnreturnVal;

}

而在服务端,采用下面的方式完成流数据的读取:

stringstr =null;stringstrAll =null;

System.Text.StringBuilder sb=newSystem.Text.StringBuilder();

StreamReader sr=newStreamReader(pipeServer);while(pipeServer.CanRead && (null!= (str =sr.ReadLine())))

{//当遇到连续2个换行外加#END,表示输入结束if(str =="#END")

{

strAll=sb.ToString();if(strAll.EndsWith("\r\n\r\n"))

break;

}else{if(str =="")

sb.AppendLine();elsesb.AppendLine(str);

}

}

strAll= strAll.Substring(0, strAll.Length -"\r\n\r\n\r\n".Length);

测试和下载最后,写个客户端和服务端控制台程序:

namespaceNamePipedSample_Server

{classPRogram

{staticvoidMain(string[] args)

{

NamedPipeListenServer svr=newNamedPipeListenServer("test");

svr.Run();

Console.Read();

}

}

}

namespaceNamePipedSample_Client

{classProgram

{staticvoidMain(string[] args)

{stringsendStr =null;using(NamedPipeClient client =newNamedPipeClient(".","test"))

{

sendStr="fff\r\ndddd\r\n";

Console.WriteLine("send:{0}",sendStr);

Console.WriteLine("Reply:{0}",client.Query(sendStr));

sendStr="54353";

Console.WriteLine("send:{0}", sendStr);

Console.WriteLine("Reply:{0}", client.Query(sendStr));

sendStr="aaaaaaa";

Console.WriteLine("send:{0}", sendStr);

Console.WriteLine("Reply:{0}", client.Query(sendStr));

}

Console.WriteLine("send all ok.");

Console.Read();

}

}

}

跨机器使用命名管道

上面的程序在本地机器使用没问题的,但是跨机器可能会遇到问题,在使用的时候,需要将主机名字 "." 替换成

实际的局域网主机名字,例如:

using(NamedPipeClient client =newNamedPipeClient("user-xxxPc","test"))

{//}

但是这样可能还是无法访问,会报下面的错误:

“System.IO.IOException”类型的未经处理的异常在 System.Core.dll 中发生

其他信息: 登录失败: 未知的用户名或错误密码。

此时需要在客户机器上,地址栏里面输入下面的地址: \\user-xxxPc

此时会提示输入用户名,密码,最后勾选 “记住账号”,下次即可使用了。

经过测试,这种方法是先命名管道客户端-服务器通信成功。 本文程序是在网友原来文章的基础上改进的,在此表示感谢,原文地址: http://blog.csdn.net/educast/article/details/7219774

本文程序Demo下载

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有