NamedPipe:通過命名管道(NamedPipe)方式與winform通信

        private void simpleButtonStartserver_Click(object sender, EventArgs e)
        {
            this.textEdit1.Text = null;
            NamedPipeServerThread = new Thread[maxNumberOfServerInstances];

            #region 通過命名管道(NamedPipe)方式與winform通信
            if (true)
            {
                for (int i = 0; i < NamedPipeServerThread.Count(); i++)
                {
                    Thread foriNamedPipeServerThread = NamedPipeServerThread[i];

                    if (foriNamedPipeServerThread != null && foriNamedPipeServerThread.ThreadState != System.Threading.ThreadState.Aborted)
                    {
                        foriNamedPipeServerThread.Abort();
                    }
                    foriNamedPipeServerThread = new Thread(new ParameterizedThreadStart(ServiceNamedPipeServerThread))
                    {
                        IsBackground = true,
                    };
                    foriNamedPipeServerThread.Start(i);
                }
            }
            #endregion
        }
        private void ServiceNamedPipeServerThread(object paraObject)
        {
            try
            {
                 NamedPipeServerStream serverNamedPipeServerStream = null;
                //創建實例
                if (serverNamedPipeServerStream != null)
                {
                    serverNamedPipeServerStream.Disconnect();
                    serverNamedPipeServerStream.Close();
                    serverNamedPipeServerStream.Dispose();
                    serverNamedPipeServerStream = null;
                }
                if (serverNamedPipeServerStream == null)
                {
                    //PipeSecurity newPipeSecurity = new PipeSecurity();
                    //newPipeSecurity.SetAccessRule(new PipeAccessRule("Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
                    //serverNamedPipeServerStream = new NamedPipeServerStream(pipeNameNamedPipe, PipeDirection.InOut, maxNumberOfServerInstances, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 1024, 1024, newPipeSecurity);
                    serverNamedPipeServerStream = new NamedPipeServerStream(pipeNameNamedPipe, PipeDirection.InOut, maxNumberOfServerInstances, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 1024, 1024);
                    int threadId = Thread.CurrentThread.ManagedThreadId;
                    serverNamedPipeServerStream.BeginWaitForConnection(new AsyncCallback(WaitForConnectionCallback), serverNamedPipeServerStream);
                }
            }
            catch (Exception catchException)
            {
                throw catchException;
            }
            finally
            {

            }
        }
        private void WaitForConnectionCallback(IAsyncResult callbackIAsyncResult)
        {
            try
            {
                var waitForConnectionCallbackNamedPipeServerStream = (NamedPipeServerStream)callbackIAsyncResult.AsyncState;

                waitForConnectionCallbackNamedPipeServerStream.EndWaitForConnection(callbackIAsyncResult);
                byte[] readBuffer = new byte[1024];
                ////callbackNamedPipeServerStream.BeginRead(readBufferNamedPipeServerStream, 0, readBufferNamedPipeServerStream.Length, EndReadCallBack, callbackNamedPipeServerStream);
                waitForConnectionCallbackNamedPipeServerStream.BeginRead(readBuffer, 0, readBuffer.Length, endReadIAsyncResult =>
                {
                    try
                    {
                        // Get the pipe
                        var endReadCallbackNamedPipeServerStream = (NamedPipeServerStream)endReadIAsyncResult.AsyncState;
                        var readBytes = endReadCallbackNamedPipeServerStream.EndRead(endReadIAsyncResult);
                        String message = Encoding.UTF8.GetString(readBuffer, 0, readBytes);

                        endReadCallbackNamedPipeServerStream.RunAsClient(new PipeStreamImpersonationWorker(
                            delegate
                            {
                                byte[] outBuffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
                                endReadCallbackNamedPipeServerStream.Write(outBuffer, 0, outBuffer.Length);
                                endReadCallbackNamedPipeServerStream.Flush();
                                endReadCallbackNamedPipeServerStream.WaitForPipeDrain();
                            }));  //模擬客戶端的用戶名,模擬的是運行服務器端的進程的用戶名

                        if (endReadCallbackNamedPipeServerStream != null)
                        {
                            endReadCallbackNamedPipeServerStream.Disconnect();
                            endReadCallbackNamedPipeServerStream.Close();
                            endReadCallbackNamedPipeServerStream.Dispose();
                            endReadCallbackNamedPipeServerStream = null;
                        }
                        try
                        {
                            if (this.InvokeRequired)
                            {
                                this.Invoke(new MethodInvoker(delegate
                                {
                                    this.textEdit1.Text = message;
                                }));
                            }
                        }
                        catch (Exception catchException)
                        {
                            throw catchException;
                        }
                        finally
                        {

                        }
                    }
                    catch (Exception catchException)
                    {
                        throw catchException;
                    }
                    finally
                    {

                    }
                }, waitForConnectionCallbackNamedPipeServerStream);
                //if (waitForConnectionCallbackNamedPipeServerStream != null)
                //{
                //    //waitForConnectionCallbackNamedPipeServerStream.Disconnect();
                //    //waitForConnectionCallbackNamedPipeServerStream.Close();
                //    //waitForConnectionCallbackNamedPipeServerStream.Dispose();
                //    //waitForConnectionCallbackNamedPipeServerStream = null;
                //}
            }
            catch (Exception catchException)
            {
                // If the pipe is closed before a client ever connects,
                // EndWaitForConnection() will throw an exception.

                // If we are in here that is probably the case so just return.
                throw catchException;
                return;
            }
            finally
            {

            }
        }

        private void simpleButtonStartClient_Click(object sender, EventArgs e)
        {
            this.textEdit2.Text = null;

            #region 啓動命名管道客戶端
            if (true)
            {
                if (NamedPipeClientThread != null && NamedPipeClientThread.ThreadState != System.Threading.ThreadState.Aborted)
                {
                    NamedPipeClientThread.Abort();
                }
                NamedPipeClientThread = new Thread(new ThreadStart(ClientNamedPipeClientThread))
                {
                    IsBackground = true,
                };
                NamedPipeClientThread.Start();
            }
            #endregion
        }
        private void ClientNamedPipeClientThread()
        {
            NamedPipeClientStream clientNamedPipeClientStream = null;

            if (clientNamedPipeClientStream != null)
            {
                clientNamedPipeClientStream.Close();
                clientNamedPipeClientStream.Dispose();
                clientNamedPipeClientStream = null;
            }

            if (clientNamedPipeClientStream == null)
            {
                try
                {
                    clientNamedPipeClientStream = new NamedPipeClientStream(serverNameNamedPipe, pipeNameNamedPipe);
                    int threadId = Thread.CurrentThread.ManagedThreadId;
                    clientNamedPipeClientStream.Connect(5000);
                    byte[] outBuffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
                    //clientNamedPipeClientStream.BeginWrite(outBuffer, 0, outBuffer.Length, new AsyncCallback(EndWriteCallBack), clientNamedPipeClientStream);
                    clientNamedPipeClientStream.BeginWrite(outBuffer, 0, outBuffer.Length, endWriteIAsyncResult =>
                    {
                        try
                        {
                        // Get the pipe
                        NamedPipeClientStream endWriteCallbackNamedPipeClientStream = (NamedPipeClientStream)endWriteIAsyncResult.AsyncState;

                        // End the write
                        endWriteCallbackNamedPipeClientStream.EndWrite(endWriteIAsyncResult);
                            endWriteCallbackNamedPipeClientStream.Flush();

                            byte[] readBuffer = new byte[1024];
                            endWriteCallbackNamedPipeClientStream.BeginRead(readBuffer, 0, readBuffer.Length, endReadIAsyncResult =>
                            {
                                try
                                {
                                // Get the pipe
                                NamedPipeClientStream endReadCallbackNamedPipeClientStream = (NamedPipeClientStream)endReadIAsyncResult.AsyncState;
                                // End the Read
                                var readBytes = endReadCallbackNamedPipeClientStream.EndRead(endReadIAsyncResult);
                                    String message = Encoding.UTF8.GetString(readBuffer, 0, readBytes);
                                    try
                                    {
                                        if (this.InvokeRequired)
                                        {
                                            this.Invoke(new MethodInvoker(delegate
                                            {
                                                this.textEdit2.Text = message;
                                            }));
                                        }
                                    }
                                    catch (Exception catchException)
                                    {
                                        throw catchException;
                                    }
                                    finally
                                    {

                                    }
                                    if (endReadCallbackNamedPipeClientStream != null)
                                    {
                                    //endReadCallbackNamedPipeClientStream.Disconnect();
                                    //endReadCallbackNamedPipeClientStream.Close();
                                    //endReadCallbackNamedPipeClientStream.Dispose();
                                    //endReadCallbackNamedPipeClientStream = null;
                                }
                                }
                                catch (Exception catchException)
                                {
                                    throw catchException;
                                }
                                finally
                                {

                                }
                            }, endWriteCallbackNamedPipeClientStream);
                            if (endWriteCallbackNamedPipeClientStream != null)
                            {
                            //endWriteCallbackNamedPipeClientStream.Disconnect();
                            //endWriteCallbackNamedPipeClientStream.Close();
                            //endWriteCallbackNamedPipeClientStream.Dispose();
                            //endWriteCallbackNamedPipeClientStream = null;
                        }
                        }
                        catch (Exception catchException)
                        {
                            throw catchException;
                        }
                        finally
                        {

                        }
                    }, clientNamedPipeClientStream);
                }
                catch (Exception catchException)
                {
                    throw catchException;
                }
                finally
                {

                }
            }
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章