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

Đăng bởi : 5/06/2014

thuvienwinform - Xin chào ! 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)

 
// 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


// 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 ^^


{ 3 comments }

  1. Anonymous5/06/2014

    Hay, bạn up project lên đc k. Mà nếu 2 server cùng tên đó có lỗi k ạ

    ReplyDelete
  2. nếu chạy cùng 2 server cùng tên thì chắc là lỗi...mình cũng chưa thử
    mạng yếu quá chưa up đc project bạn thông cảm nhé ^^ (có 15kb/s thôi)

    ReplyDelete
  3. This comment has been removed by the author.

    ReplyDelete

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -