博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
命名管道跨进程通信实例1(转)
阅读量:6435 次
发布时间:2019-06-23

本文共 3409 字,大约阅读时间需要 11 分钟。

原文地址:

本文介绍命名管道使用实例,文中例子是几个客户端都通过一台服务器获得新生成的int类型id。

服务器端功能:当客户端请求一个新的id时,将现有id自增1,然后返回给客户端。

服务器端实现:在程序启动时,启动n个线程,在每个线程中都声明一个NamedPipeServerStream的实例,并循环的WaitForConnection(),将新的id写入到命名管道中,然后断开连接。在程序退出时释放NamedPipeServerStream实例

服务器端代码:

class Program{    //命名管道名字    private const string PIPE_NAME = "testpipe";    //定义线程数,也是NamedPipeServerStream的允许最多的实例数    private const int MAX_THREAD_COUNT = 3;    private static volatile int _runingThreadCount = 0;    private static volatile int _newID = 0;    private static NamedPipeServerStream[] _serverStreams;    static void Main(string[] args)    {        _serverStreams = new NamedPipeServerStream[MAX_THREAD_COUNT];        //在进程退出时,释放所有NamedPipeServerStream实例        AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);        //启动线程        StartServers();        Console.Read();    }    ///     /// 进程退出时释放命名管道    ///     ///     ///     static void CurrentDomain_ProcessExit(object sender, EventArgs e)    {        if (_serverStreams != null)        {            foreach (NamedPipeServerStream item in _serverStreams)            {                item.Dispose();            }        }    }    ///     /// 启动线程    ///     private static void StartServers()    {        for (int i = 0; i < MAX_THREAD_COUNT; i++)        {            Thread thread = new Thread(new ThreadStart(StartNewIDServer));            thread.Start();        }    }    ///     /// 启动一个NamedPipeServerStream实例    ///     private static void StartNewIDServer()    {        NamedPipeServerStream stream = null;        Console.WriteLine("start server in thread:" + Thread.CurrentThread.ManagedThreadId);        stream = _serverStreams[_runingThreadCount] = new NamedPipeServerStream(PIPE_NAME,            PipeDirection.InOut,            MAX_THREAD_COUNT,            PipeTransmissionMode.Message,            PipeOptions.None);        while (true)        {            stream.WaitForConnection();            int newID = ++_newID;            byte[] bytes = BitConverter.GetBytes(newID);            stream.Write(bytes,0,bytes.Length);            stream.Flush();            Console.WriteLine("threadNo:"+Thread.CurrentThread.ManagedThreadId+"\r");            stream.Disconnect();        }    }}

客户端的功能是不断的发出获得新id的请求,并打印新id,在客户端可以配置服务端的服务器IP。

客户端代码:

class Program{    private const string PIPE_NAME = "testpipe";    static void Main(string[] args)    {        Console.WriteLine("请输入任何字符回车开始执行程序...");        Console.Read();        do        {            //内网服务器IP,必须是局域网            string serverName = "127.0.0.1";            //声明NamedPipeClientStream实例            using (NamedPipeClientStream clientStream=new NamedPipeClientStream(                serverName,                PIPE_NAME                ))            {                //连接服务器                clientStream.Connect(1000);                //设置为消息读取模式                clientStream.ReadMode = PipeTransmissionMode.Message;                do                {                    byte[] bytes = new byte[4];                    clientStream.Read(bytes,0,4);                    int val = BitConverter.ToInt32(bytes,0);                    Console.WriteLine("NewID=="+val+"\r");                } while (!clientStream.IsMessageComplete);            }            Thread.Sleep(1);        } while (true);    }}

在sql server中就使用了命名管道在局域网内挂进程通讯。

在声明NamedPipeServerStream实例是可以指定其实例个数,如果实例数超过这个数,就会抛出“所有管道范例都在使用中”的IO异常。

本例不可以在实际项目中使用。

转载地址:http://olqga.baihongyu.com/

你可能感兴趣的文章
win32窗口机制之CreateWindow
查看>>
C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组
查看>>
awakeFromNib小总结
查看>>
java知识大全积累篇
查看>>
图像特效——摩尔纹 moir
查看>>
Android OpenGL ES(十)绘制三角形Triangle .
查看>>
EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
查看>>
善于总结所做所学的内容
查看>>
Lua-简洁、轻量、可扩展的脚本语言
查看>>
org.hibernate.MappingException: entity class not found hbm可以解析,但是实体类不能解析...
查看>>
Android -- Drag&&Drop
查看>>
Extjs4:改变Grid单元格背景色(转载)
查看>>
中医无绝症[转载]
查看>>
ZendStudio10.6.1如何安装最新的集成svn小工具?
查看>>
PHP中$_SERVER的详细参数与说明
查看>>
jquery easyui datagrid mvc server端分页排序筛选的实现
查看>>
去了大公司就一定能学到很牛的技术么?
查看>>
methanol 模块化的可定制的网页爬虫软件,主要的优点是速度快。
查看>>
IOS开发之表视图(UITableView)
查看>>
Notepad++去除代码行号的几种方法
查看>>