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
{
}
}
}