当前位置:   article > 正文

C# 命名管道NamedPipeServerStream使用

namedpipeserverstream

NamedPipeServerStream 是 .NET Framework 和 .NET Core 中提供的一个类,用于创建和操作命名管道的服务器端。命名管道是一种在同一台计算机上或不同计算机之间进行进程间通信的机制。

命名管道允许两个或多个进程通过共享的管道进行通信。其中一个进程充当服务器,创建管道并等待客户端连接。其他进程充当客户端,连接到服务器创建的管道,并通过管道进行数据交换。

NamedPipeServerStream 类提供了创建命名管道服务器端的功能。它允许你指定管道的名称、方向(输入、输出或双向)和一些其他选项。一旦服务器端创建并等待连接,客户端可以使用 NamedPipeClientStream 类连接到该管道,并进行数据交换。

本次只演示客户端-服务端通讯:

服务端: 

  1. /// <summary>
  2. /// 服务端
  3. /// </summary>
  4. public partial class FrmTest : Form
  5. {
  6. private NamedPipeServerStream pipeServer;
  7. volatile bool _receive = true;
  8. public FrmTest()
  9. {
  10. InitializeComponent();
  11. // 连接到命名管道
  12. pipeServer = new NamedPipeServerStream("Test", PipeDirection.In);
  13. Thread thread = new Thread(() =>
  14. {
  15. while (_receive)
  16. {
  17. try
  18. {
  19. if(!pipeServer.IsConnected)
  20. {
  21. Console.WriteLine("等待客户端连接。。。");
  22. pipeServer.WaitForConnection();
  23. Console.WriteLine("客户端已连接。。。");
  24. }
  25. // 读取字节大小
  26. byte[] sizeBuffer = new byte[sizeof(int)];
  27. pipeServer.Read(sizeBuffer, 0, sizeBuffer.Length);
  28. int messageSize = BitConverter.ToInt32(sizeBuffer, 0);
  29. // 消息内容
  30. byte[] responseBytes = new byte[messageSize];
  31. Console.WriteLine("等待客户端发送消息。。。");
  32. int bytesRead = pipeServer.Read(responseBytes, 0, responseBytes.Length);
  33. Console.WriteLine("客户端已发送消息。。。");
  34. string response = Encoding.UTF8.GetString(responseBytes, 0, bytesRead);
  35. this.ExecBeginInvoke(() =>
  36. {
  37. this.richTextBox1.AppendText(DateTime.Now.ToStringFromDateTime() + ":\r\n" + response + "\r\n");
  38. });
  39. pipeServer.Disconnect();
  40. }
  41. catch (Exception ex)
  42. {
  43. Trace.WriteLine(ex.Message+"\r\n"+ex.StackTrace);
  44. }
  45. finally
  46. {
  47. }
  48. }
  49. });
  50. thread.Start();
  51. }
  52. private void button1_Click(object sender, System.EventArgs e)
  53. {
  54. }
  55. private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
  56. {
  57. _receive = false;
  58. if (pipeServer.IsConnected)
  59. {
  60. pipeServer.Disconnect();
  61. }
  62. // 关闭管道
  63. pipeServer.Close();
  64. this.Dispose();
  65. Application.ExitThread();
  66. Application.Exit();
  67. Process.GetCurrentProcess().Kill();
  68. }
  69. private void FrmTest_FormClosed(object sender, FormClosedEventArgs e)
  70. {
  71. }
  72. }

客户端: 

  1. /// <summary>
  2. /// 客户端
  3. /// </summary>
  4. public partial class FrmTest : Form
  5. {
  6. public FrmTest()
  7. {
  8. InitializeComponent();
  9. }
  10. private void button1_Click(object sender, EventArgs e)
  11. {
  12. string msg = this.richTextBox1.Text;
  13. // 连接到命名管道服务器
  14. using (NamedPipeClientStream clientStream = new NamedPipeClientStream(".", "Test", PipeDirection.Out))
  15. {
  16. try
  17. {
  18. Console.WriteLine("等待连接到服务器");
  19. clientStream.Connect(5000);
  20. Console.WriteLine("已连接到服务器");
  21. // 向服务器发送消息
  22. string message = msg;
  23. byte[] messageBytes = Encoding.UTF8.GetBytes(message);
  24. byte[] msgSize = Encoding.UTF8.GetBytes(messageBytes.Length.ToString());
  25. clientStream.Write(msgSize, 0, msgSize.Length);
  26. clientStream.Write(messageBytes, 0, messageBytes.Length);
  27. Console.WriteLine("已发送消息至服务器");
  28. }
  29. catch(Exception ex)
  30. {
  31. Console.WriteLine("连接超时。。。");
  32. }
  33. finally
  34. {
  35. clientStream.Close();
  36. }
  37. }
  38. }
  39. private void FrmTest_FormClosing(object sender, FormClosingEventArgs e)
  40. {
  41. this.Dispose();
  42. Application.ExitThread();
  43. Application.Exit();
  44. }
  45. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/847675
推荐阅读
相关标签
  

闽ICP备14008679号