Đăng Nhập

Vui lòng khai báo chính xác tên truy cập và mật khẩu!

Quên mật khẩu?

    Truyền dữ liệu qua lại giữa các Process và ứng dụng

      Admin
      Admin

      Giới tính : Nam

      Đến từ : TPHCM

      Ngày Tham gia : 03/04/2011

      Tổng số bài gửi : 2292

      #1

       Wed Feb 18, 2015 12:56 pm

      Hôm nay mình sẽ hướng dẫn truyền dữ liệu qua lại giữa các Process. Việc này tưởng như không quan trọng lắm nhưng thực ra nó rất cần thiết khi code các phần mềm liên quan tới quản lí máy tính như Antivirus....

      I. Vấn đề
      Chắc hẳn các bạn đã dùng nhiều phần mềm diệt virus và thấy luôn có 1 exe riêng cho Tray (chạy dưới khay taskbar). Hãy tự hỏi tại sao lại phải tách riêng ra như vậy mà không code gộp vào 1 exe cho dễ quản lí ???
      Đơn giản thôi, vì cái Tray đó làm nhiệm vụ quản lí Runtime (thời gian thực -- chạy liên tục cùng máy tính) và nếu gộp vào thì sẽ rất ngốn RAM (Ram sẽ phải load cả phần giao diện ...) nên để hệ thống chạy "êm và không nặng nề" người ta đã làm Tray ra 1 exe riêng biệt . ^^ và bây giờ việc truyền dữ liệu giữa Process là vấn đề quan trọng

      II. Giải quyết
      Thời còn .NET Framework 3.0 trở xuống người ta vẫn phải truyền dữ liệu qua lại giữa Process thông qua File. Nhưng tới .NET 3.5 , đã có 1 công nghệ xuất hiện để giải quyết vấn đề này.

      Hôm nay mình sẽ giới thiệu vs các bạn công nghệ Pipes - công nghệ này chạy theo mô hình Server/Client
      (using System.IO.Pipes) tức là 1 process sẽ đóng vai trò như 1 máy chủ, các process khác gửi nhận dữ liệu thông qua Server.

      Xem 1 ví dụ đơn giản nhé (Ví dụ vẫn là cách học dễ nhất nhỉ ^^)

      * Server :
      Form server của mình có 1 textbox và 1 nút
      (ấn vào button sẽ gửi data trong textbox cho Client)

         

      Code:
      // Biến Server
      private NamedPipeServerStream sv;

              public Server()
              {
                  InitializeComponent(); 
              }

              private void Server_Load(object sender, EventArgs e)
              {
                         // Tạo server có tên "ServerTest"
                  sv = new NamedPipeServerStream("ServerTest", PipeDirection.InOut);
                         // Đợi 1 client khác kết nối
                  sv.WaitForConnection();
              }

              private void button1_Click(object sender, EventArgs e)
              {
                    // Khi ấn Button1 - Gửi dữ liệu cho client (phải gửi dạng byte nhé)
                  var data = Encoding.Unicode.GetBytes(this.textBox1.Text);
                  sv.Write(data, 0, data.Length);
       
              }




      * Client 
      Form Client chỉ có 1 ricktexbox để cập nhật

      Code:
      // Client
      NamedPipeClientStream stream;

              public Client()
              {
                  InitializeComponent();
                  
              }

              private void Client_Load(object sender, EventArgs e)
              {
                       // Kết nối tới "ServerTest"
                  stream = new NamedPipeClientStream("ServerTest");
                  stream.Connect();
              }

              private void timer1_Tick(object sender, EventArgs e)
              {
                  // Timer này cập nhật dữ liệu liên tục dưa vào RickTextbox mình đã tạo
                  var re = new byte[1000];

                  stream.Read(re, 0, 1000);
                  string data = Encoding.Unicode.GetString(re);

                  if (data != "")
                      richTextBox1.Text += "\n" + data;
              }



      Chạy server trước, sau đó chạy client và thử nhé ^^!

      Ô xong rồi ^^!
      Vậy đã truyền được dữ liệu giữa các process ^^