Phần 1: Ví dụ mẫu .Net Remoting & Windows Services

Phần 1: Ví dụ mẫu .Net Remoting & Windows Services

Phần 1: Tôi hướng dẫn các bạn cách thực hiện .Net Remoting. Sẽ có 3 Project trong solution này. Tầng ProxyObject, tầng Server và tầng Client. Trong đó tầng Server sẽ có giao diện để Start Stop Server, Tầng Client có giao diện để kết nối tới Server để gọi một số phương thức trong tầng ProxyObject.

Phần 2: Tiếp tục với ví dụ trong phần 1, nhưng trong trường hợp này Tôi sẽ không tạo giao diện cho tầng Server, mà Tôi đưa tầng Server về chạy theo dạng Windows Services.

Tôi nghĩ rằng Topic này sẽ rất hữu ích cho những bạn muốn quan tâm tới các chương trình .Net Remoting, Windows Services, cách sử dụng component Eventlog, cũng như cách làm deployed chương trình. Vì Tôi hướng dẫn chi tiết nên có thể bạn cảm thấy làm nó dài và phức tạp, nhưng thực ra nếu khi các bạn làm hiểu rành rồi thì chỉ cần 5-10 phút là xong tầng Service và Setup. Chúc các bạn thành công.

Dưới đây là các bước chi tiết cho phần 1:

Bước 1: Tạo tên Solution

Bước 2: Tiến hành tạo 3 Project cho Solution: Tầng ProxyObject, tầng Server và Client

Bước 3: Tiến hành viết coding cho tầng ProxyObject

Bước 4: Tiến hành viết coding cho tầng Server

Bước 5: Tiến hành viết code cho Tầng Client

Bước 6: Biên dịch và chạy chương trình

-------------------------------------------

Bước 1: Tạo tên Solution

Tôi đặt solution cho ví dụ này là: NetRemotingAndWindowsServices

Để đơn giản, tầng ProxyObject Tôi chỉ viết 1 class gọi là PrimeProxy, class này có nhiệm vụ nhận vào 1 số nguyên từ tầng client, sau đó trả về dãy số nguyên tố từ 2 tới n và đồng thời cho biết client là người thứ mấy gọi yêu cầu lên server.

Cách tạo : Vào menu File/ New/ chọn Project hoặc nhấn tổ hợp phím Ctrl+Shift+N

Cửa sổ New Project sẽ hiển thị ra, bạn hãy chọn Blank Solution trong mục Visual Studio Solutions

Phần 1: Ví dụ mẫu .Net Remoting & Windows Services

Trong ô Name: Nhập tên NetRemotingAndWindowsServices sau đó nhấn nút OK.

Bạn quan sát trong mục Solution Explorer sẽ xuất hiện tên Solution mà bạn vừa tạo

Bước 2: Tiến hành tạo 3 Project cho Solution: Tầng ProxyObject, tầng Server và Client

-         Tầng ProxyObject: Trong tầng này bạn phải chọn là Class Library

-         Bấm chuột phải vào tên solution/ chọn Add / chọn New Project

-         Sau khi bạn chọn New Project thì cửa sổ Add New Project xuất hiện, tại cửa sổ này bạn hãy chọn Class Libray

-         Trong ô Name: bạn gõ tên ProxyObject rồi click OK.

-         Tiếp theo bạn tạo tầng Server và Client, cách tạo 2 tầng này sẽ tương tự như tầng ProxyObject,  nhưng chọn là Windows Forms Application thay vì Class Library

-         Bạn tuần tự tạo xong các tầng, và quan sát Solution Explorer:

Ta có 3 Projects trong Solution NetRemotingAndWindowsServices

Bước 3: Tiến hành viết coding cho tầng ProxyObject

-         Đổi tên Class1 thành PrimeProxy và viết code như bên dưới:

using System;using System.Collections.Generic;

using System.Linq;using System.Text;

namespace ProxyObject{

public class PrimeProxy:MarshalByRefObject{//Biến lưu số lần client gọi hàm lấy danh sách nguyên tố

private int m_RequestNumber = 0;

//Biến lưu tên Client hiện tại gọi hàm

private string m_strCurrentClient = “”;

//Biến lưu danh sách tên các client đã connect tới server

private List<string> m_listClient = new List<string>();

//hàm kiểm tra số nguyên tố

public bool isPrime(int k)

{

if (k < 2) return false;

for (int i = 2; i <= Math.Sqrt(k); i++)

if (k % 2 == 0) return false;

return true;

}

//hàm thiết lập client hiện tại connect tới server và

//lưu client vào danh sách đã kết nối

public void setConnectClient(string clientName)

{

m_strCurrentClient = clientName;

if (!m_listClient.Contains(clientName))

m_listClient.Add(clientName);

}

//Hàm trả về danh sách các số nguyên tố

public List<int> getListPrime(int n)

{

m_RequestNumber++;

List<int>lst=new List<int>();

for (int i = 2; i <= n; i++)

if (isPrime(i))

lst.Add(i);

return lst;

}

public int RequestNumber

{

get { return this.m_RequestNumber;}

}

public string CurrentClient

{

get { return this.m_strCurrentClient; }

}

public List<string> ListClient

{

get { return this.m_listClient; }

}

}

}

Bước 4: Tiến hành viết coding cho tầng Server

Đổi class Form1.cs thành frmServer.cs và thiết kế giao diện như hình bên dưới:

Control Tên Control Mô tả
TextBox txtPort Dùng để nhập Port server
TextBox txtStatus Để hiện thị trạng thái Server
RadioButton radSingleton Singleton
RadioButton radSingleCall SingleCall
Button btnStart Khởi động
Button btnStop Tắt

Sau khi thiết kế xong, để tiến hành Coding cho tầng Server thì bạn phải tham chiếu như hướng dẫn bên dưới:

-         Tầng Server phải tham chiếu tới tầng ProxyObject và thư viện System.Runtime.Remoting

Tham chiếu tới ProxyObject: Bấm chuột phải vào References / Add Reference…

Cửa sổ Add Reference hiển lên, chọn ProxyObject rồi nhấn OK

Tương tự khi Add tham chiếu tới thư viện System.Runtime.Remoting, trường hợp này bạn chọn tab.NET thay vì tab Project.

Trong tab .NET bạn chọn System.Runtime.Remoting rồi nhấn OK

Sau đó bạn quan sát tầng Server, nếu như nó như hình bên dưới là đã thành công:

-         Bây giờ ta tiến hành viết code cho tầng Server, xem coding:

using System;using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using ProxyObject;

namespace TangServer

{

public partial class frmServer : Form

{

private TcpChannel tcpChannel = null;

private int port = 8998;

private Type type;

private WellKnownObjectMode wellKnownMode;

private string objURI;

public frmServer()

{

InitializeComponent();

}

private void btnStart_Click(object sender, EventArgs e)

{

try

{

btnStop.PerformClick();

port = Int32.Parse(txtPort.Text);

//tạo kênh truyền dữ liệu

tcpChannel = new TcpChannel(port);

ChannelServices.RegisterChannel(tcpChannel, false);

//đăng ký remote object với Remoting framework

type = typeof(PrimeProxy);

objURI = “PRIME_URI”;

if (radSingleTon.Checked == true)

wellKnownMode = WellKnownObjectMode.Singleton;

else

wellKnownMode = WellKnownObjectMode.SingleCall;

RemotingConfiguration.RegisterWellKnownServiceType

(type, objURI, wellKnownMode);

txtStatus.Text = “khởi động server tại por ” + port.ToString() + ” lúc ” + DateTime.Now.ToString();

}

catch (Exception ex)

{

MessageBox.Show(“Lỗi”, ex.Message);

}

}

private void btnStop_Click(object sender, EventArgs e)

{

if (ChannelServices.GetChannel(“tcp”) != null)

{

ChannelServices.UnregisterChannel(tcpChannel);

txtStatus.Text = “tắt server tại port ” + port.ToString() + ” lúc ” +   DateTime.Now.ToString();

}

}

}

}

Bước 5: Tiến hành viết code cho Tầng Client

Đổi class Form1.cs thành frmClient.cs và thiết kế giao diện như hình bên dưới:

Control Tên Control Mô tả
TextBox txtIP Địa chỉ server: tên hoặc IP
TextBox txtPort Để nhập Port kết nối
TextBox txtClient Tên client sử dụng : Tèo
TextBox txtN Nhập N để lấy dãy nguyên tố
Button btnConnect Bắt đầu kết nối tới server
Button btnGetResult Lấy kết quả từ server
ListBox lstbListPrime ListBox lưu dãy nguyên tố
ListBox lstbListClient ListBox lưu danh sách Client
Label lblMessage Số lần hàm được triệu gọi từ client
Label lblStatus Trạng thái

-         Tương tự như tầng Server, bạn tham chiếu tới tầng ProxyObject và thư việnSystem.Runtime.Remoting

-         Bây giờ ta tiến hành viết code cho tầng Client, xem coding:

using System;using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using ProxyObject;

namespace TangClient

{

public partial class frmClient : Form

{

#region variables

string URL = “”;

Type type;

PrimeProxy primeObject;

#endregion

public frmClient()

{

InitializeComponent();

}

private void enableControl(bool b)

{

btnGetResult.Enabled = b;

txtClient.Enabled = b;

txtN.Enabled = b;

}

private void btnConnect_Click(object sender, EventArgs e)

{

try

{

//xây dựng chuỗi URL để truy tìm tài nguyên trên server

URL = “tcp://” + txtIP.Text + “:” + txtPort.Text + “/PRIME_URI”;

//đăng ký remote object

type = typeof(PrimeProxy);

RemotingConfiguration.RegisterWellKnownClientType(type, URL);

//tạo proxy

primeObject = new PrimeProxy();

lblStatus.Text = “Đã tạo xong proxy, vui lòng nhập Client, nhập N:”;

enableControl(true);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

enableControl(false);

URL = “”;

}

}

private void frmClient_Load(object sender, EventArgs e)

{

enableControl(false);

}

private void btnGetResult_Click(object sender, EventArgs e)

{

string client = txtClient.Text;

int n = Int32.Parse(txtN.Text);

//Gửi tên client lên server

primeObject.setConnectClient(client);

//Lấy danh sách các số nguyên tố từ server về

List<int> listPrime= primeObject.getListPrime(n);

//Đưa danh sách số nguyên tố lên ListBox

lstbListPrime.Items.Clear();

foreach(int x in listPrime)

lstbListPrime.Items.Add(x);

//Lấy danh sách Client tồn tại trên server

List<string> listClient = primeObject.ListClient;

//Đưa danh sách client lên Listbox

lstbListClient.Items.Clear();

lstbListClient.Items.AddRange(listClient.ToArray());

string message = “”;

message =”Hello [" + primeObject.CurrentClient + "] Hàm này được triệu gọi “

+ primeObject.RequestNumber +”\n”;

if(primeObject.RequestNumber==1)

message += ” Bạn là người đầu tiên triệu gọi hàm này!”;

else

message += ” Người gọi hàm này trước đó là [" +

listClient[listClient.Count-2] + “]”;

lblMessage.Text = message;

}

}

}

Bước 6: Biên dịch và chạy chương trình

Vào Menu Build / chọn Batch Build…Cửa sổ Batch Build sẽ hiển thị ra như bên dưới. Trong cửa sổ này bạn checked hết các tầng muốn build, rồi bấm Build hoặc Rebuild

Sau khi biên dịch xong, bạn vào thư mục bin/release của tầng Server và Client. Bạn tiến hành chạy chương trình:

Chạy tầng Server:

Chọn Port 8998, Singleton rồi bấm nút Khởi động, bạn sẽ được kết quả như hình trên. Để hiểu rõ cơ chế Singleton và SingleCall như thế nào thì các bạn xem các topic về .Net Remoting trong chuyên đề phát triển phần mềm mà tôi đã hướng dẫn.

-         Tiến hành chạy thử vài Client bạn sẽ có kế quả như hình bên dưới:

Các bạn chú ý là click nút Kết nối trước, sau đó mới click nút Lấy kết quả.

Bạn có thể chạy nhiều client để kiểm tra kết quả.

Bạn thấy bài viết này như thế nào?: 
No votes yet
Ảnh của Tommy Tran

Tommy owner Express Magazine

Drupal Developer having 9+ year experience, implementation and having strong knowledge of technical specifications, workflow development. Ability to perform effectively and efficiently in team and individually. Always enthusiastic and interseted to study new technologies

  • Skype ID: tthanhthuy

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Instagram Tips – Use Instagram Like a Pro

Instagram Tips – Use Instagram Like a Pro

Instagram is one of the most popular app available for Apple iOS and very soon it was available for Android users.

Người mẫu Prodan muốn làm bà chủ CLB FC Hermannstadt tại Romania

Người mẫu Prodan muốn làm bà chủ CLB FC Hermannstadt tại Romania

Nữ đại diện, người mẫu Playboy Anamaria Prodan muốn làm bà chủ CLB FC Hermannstadt

Drupal 6 Search Engine Optimization by Ben Finklea, CEO

Download Drupal: Search Engine Optimization

Learn which modules to install and how to configure them for maximum SEO results

Công ty diệt chuột T&C

 

Diet con trung