Lập trình phân tán REMOTING trong .NET
Remoting là gì? Là một công nghệ lập trình phân tán của .Net, nó tương tự như công nghệ lập trình phân tán RMI của java. Nó cho phép máy khách triệu gọi phương thức của đối tượng từ xa. ...
Remoting là gì?
Là một công nghệ lập trình phân tán của .Net, nó tương tự như công nghệ lập trình phân tán RMI của java. Nó cho phép máy khách triệu gọi phương thức của đối tượng từ xa.
serverProxyĐốitượng ServerĐối tượngClientCách thức hoạt động
-Client và Server cùng có giao diện của Remoting.
-Server triển khai đối tượng, đăng ký với Remoting channel services.
-Client kết nối tới remoting services để lấy tham chiếu đối tượng Remote
-Client trao đổi với server qua proxy class(interface) và Remoting services.
.Net framework thì cung cấp rất nhiều những dịch vụ cái mà có sử dụng Remoting.
- Những kênh truyền thông có nghĩa vụ truyền tải những thông báo qua lại giữa ứng dụng từ xa.
- Địng dạng ghi thành mã và đọc ra thông báo trước khi chúng được chuyển tới bằng các kênh.
- Sự uỷ nhiệm gọi phương thức tới đối tượng thích hợp.
- Kích hoạt đối tượng từ xa và sự hỗ trợ trong suốt quá trình tồn tại.
- Kênh chuyền tải thông báo tới bằng đối tượng từ xa.
- Trước khi gọi một đối tượng từ xa, client đăng ký cái kênh đó trên mỗi ứng dụng cơ sở.
- Một máy tính không thể có nhiều hơn một kênh để lắng nghe từ một cổng.
.Net cung cấp kênh thực thi HTTP và TCP
- Kênh mặc định HTTP:Chuyển dữ liệu qua mạng theo định dạng XML bằng giao thức SOAP.
- Kênh mặc định TCP:Chuyển dữ liệu qua mạng theo dạng nhị phân bằng giao thức TCP.
VD:Chương trình đã đăng ký kênh TCP với cổng 8085.
using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
TcpChannel chan=new TcpChannel(8985);
ChannelServices.RegisterChannel(chan);
- Kênh được sử dụng để vận chuyển những thông báo tới bằng đối tượng triệu gọi từ xa.Khi một Client gọi phương thức trên đối tượng từ xa, các thông số, giống như chi tiết khác cái có liên quan tới tất cả thì truyền qua kênh tới đối tượng từ xa. Một vài kết quả trả từ về theo con đường mà client đã gọi.
- Định dạng thì đã được ghi thanh mã và gửi dữ liệu vào những thông báo trứơc khi chúng được truyền lên trên Kênh.
- Việc lựa chọn Kênh:
Bởi vì client có thể đăng ký một trong số nhiều Kênh trên server để giao tiếp với các đối tượng ở xa, bạn có thể lựa chọn Kênh phù hợp với cái bạn cần. Bạn cũng có thể sử dụng cái kênh đã có hoặc xây dụng một kênh sử dụng giao thức truyền thông khác.
- Lựa chọn kênh theo tiêu chuẩn sau.
- Kênh buộc phải đăng ký trước đối tượng đăng ký.Tối thiểu một kênh phải đăng ký với các bộ phận, thiết bị trước đối tượng từ xa có thể gọi đến.
- Kênh phải đăng ký trên nền tảng mỗi ứng dụng riêng. Một quá trình đơn giản có thể chứa nhiều ứng dụng.Khi một quá trình đã chắn gửi đi hoàn tất , toàn bộ kênh đã ghi lại và tự động huỷ đi.
- Nó thì không phù hợp khi đăng ký một kênh để lắng nghe trên cổng đã được đăng ký bởi một cái khác
Mặc dù kênh đã được đăng ký trên mỗi ứng dụng cơ sở, khác với ứng dụng khác trên một máy tính không thể đăng ký những kênh lắng nghe như những cái cổng.
Client có thể truyền đạt với các đối tượng từ xa bằng việc sử dụng kênh đã đăng ký. Cái khuôn mẫu từ xa đảm bảo cho những đối tượng từ xa kết nối phù hợp với kênh khi client thử kết nối với nó.Client có trách nhiệm chỉ rõ kênh trước khi kết nối và truyền đạt với đối tượng từ xa.
Để chỉ rõ kênh, bạn có thể sử dụng file cấu hình điều khiển từ xa của .Net hoặc bạn có thể gọi phương thức của kênh đã đăng ký trên lớp của kênh phục vụ.
Net framework cung cấp sự hỗ trợ cho kênh HTTP, TCP và SMTP.Bởi vì kênh điều khiển từ xa của .Net thì lặp đi lặp lại bạn có thể và lặp lại trong kênh thêm vào sự truyền tải duy nhất và ghi thành mã yêu cầu.
- Định dạng được sử dụng để ghi thành mã và đọc các thông báo.
Mỗi kênh cung cấp một định dạng mặc định riêng. Tuy nhiên bạn có thể chỉ rõ định dạng bạn muốn sử dụng.
Kênh HTTP:
Kênh HTTP sử dụng giao thức SOAP để truyền thông tin qua đối tượng từ xa.Toàn bộ những thông báo thì được truyền qua định dạng của SOAP. Ở nơi nào đó thông báo được thay đổi và chuyển thành XML và xuất đi theo định kỳ. sau đó yêu cầu gắn tiêu đề của SOAP phải có thêm một luồng.
Như một sự lựa chọn, bạn có thể chỉ rõ định dạng nhị phân, kết quả thì nằm trong luồng dữ liệu nhị phân.Trong một trường hợp khác, luồng dữ liệu được chuyển tới đích mà không thay đổi định dạng bằng cách sử dụng giao thức HTTP. Bạn có thể tạo ra một kỹ thuật chuẩn cho XML trong Web services bằng việc sử dụng kênh HTTP với định dạng SOAP mặc định.
Kênh TCP:
Từ các mặc định, kênh TCP sử dụng định dạng nhị phân và xuất tất cả những thông tin thành luồng nhị phân và chuyển luồng đó tới đích không đổi bằng cách sử dụng giao thức TCP.
Như một sự lựa chọn, bạn có thể chỉ rõ định dạng SOAP, với kết quả trong luồng dữ liệu XML. Bạn có thể thực hiện được tốt hơn bằng cách sử dụng kênh TCP với địng dạng nhị phân bạn có thể sử dụng XML web services.
VD:Một đoạn chương trình thể hiện việc đăng ký một kênh HTTP trên cổng 9999 bằng cách sử dụng Channelservices.RegisterChannel;
- Chúng ta nên sử dụng kênh HTTP vì dữ liệu chuyển qua là XML không phụ thuộc vào hệ nền, không phụ thuộc vào ngôn ngữ lập trình, còn dữ liệu ở dạng nhị phân thì tuỳ từng dot net mà nó quy dịnh ta sẽ không rõ được.
- Dữ liệu định dạng bằng SOAP sẽ lớn hơn nên chuyển qua mạng sẽ chậm hơn
III.Kích hoạt
- Trước khi sử dụng đối tượng điều khiển từ xa thì trước tiên client buộc phải kích hoạt nó.
- Bằng cách gọi mới:Activator.CreateInstance hoặc Activator.GetObject.
- Kích hoạt sử dụng trở lại lớp proxy bởi client để truy cập đối tượng điều khiển từ xa.
- Proxy miêu tả đối tượng từ xa trong ứng dụng cơ sở của client.
- Proxy sẽ xúc tiến việc gọi của client và trả lại kết quả và ngoại lệ.
- Kích hoạt ở phía server:Tự động thuyết minh bởi server
-Ở phía server hỗ trợ phương thức kích hoạt cả Single call và singleton .
- Single call: đối tượng chỉ sử dụng để chia sẻ dữ liệu cho một client và có nhiều đối tượng được tạo ra. Single call là đối tượng rất hữu ích trong:
+Đưa lên phía trên đầu tạo ra đối tượng thì không có ý nghĩa.
+Đối tượng thì cấu hình trong cách đưa dữ liệu lên.
+Trạng thái thông tin thì thường không cần giữa các phương thức gọi.
->Bởi vì đối tượng single call không lưu trữ trạng thái của thông tin giữa các phương thức gọi, chúng có một vài lần đề cập tới nhưng không được chấp nhân.
- Singleton :sử dụng khi muốn chia sẻ dữ liệu cho nhiều client khác nhau.và có một đối tượng được tạo ra.Bởi vậy đối tượng singleton có thể lưu trữ trạng thái của thông tin giữa yêu cầu của client Đối tượng singleton thì rất hữu ích khi bạn muốn chia sẻ dữ liệu giữa client và các phương thức yêu cầu, và trong khi phía đầu của việc tạo ra và giữ cho đối tượng đó luôn tồn tại.
->Bởi vì đối tượng singleton cso thể giữ lại được trạng thái trong giai thời kỳ dài.
- Kích hoạt ở phía client: Kích hoạt đối tượng ở client là kích hoạt trên yêu cầu từ client. Đây là phương thức kích hoạt đối tương thì giống như thành phần COM kích hoạt. Thao tác kích hoạt truy cập thì cho phép:
+Khi một client yêu cầu đối tượng server, kích về yêu cầu thông báo thì gủi tới ứng dụng từ xa.
+Server sau khi tạo ra một trường của lớp yêu cầu và trả ra đối tượng cho ứng dụng client đó chính là dẫn chứng.
+Một proxy thì tạo ra ở phía client bằng việc sử dụng đối tượng.
- Trạng thái liên tục giữa phương thức gọi trong ví dụ của client.
-Remoting framework hỗ trợ cả về phía server và client kích hoạt đối tượng từ xa.
-Điều kiện kích hoạt ở phía server là khi một client cố gắng truy cập tới đối tượng, một đối tượng tự động thuyết minh ở trên server
-Phía client:theo một hướng khác, điều kiện để đối tượng đó nói ra trong câu trả lời để kích hoạt yêu cầu từ client.
bạn có thể lựa chọn một kiểu kích hoạt để điều khiển việc thuyết minh trong suốt vòng đời của đối tượng.
-Một client kích hoạt đối tượng cso thể lưu giứ trạng thái giữa phương thức gọi của riêng client.Dù thế nào thì trạng thái thông tin thì không chia sẻ cho nhiều đối tương client. Mỗi yêu cầu về đối tượng từ xa, ví dụ trả ra một proxy trường hợp độc lập của kiểu server.
-Một chức năng hữu ích của đối tượng kích hoạt client thì xây dựng căn cứ có thể hợp quy cách bằng một ứng dụng để xây dựng đối tượng trong ứng dụng từ xa.
- Phương thức kích hoạt của đối tưọng từ xa.
-Trước khi client sủ dụng đối tượng từ xa, đối tượng từ xa cần phải được kích hoạt rồi và client phải chứa proxy để truy cập tới đối tượng từ xa.
-Bạn có thể kích hoạt một đối tượng từ xa bằng cách gọi mới hoặc bằng cách gọi phương thức ở dưới của lớp kích hoạt:
*Activator.CreateInstance
Sử dụng để tạo đối tượng làm ví dụ.
*Activator.GetObject
Hầu hết mọi người sử dụng để kết nối tới một đối tượng đang chạy trên danh nghĩa URI.
- Vai trò của proxies trong việc kích hoạt đối tượng từ xa.
-Khi một client kích hoạt đối tượng từ xa thì client đó phải chứa proxy trong cái lớp làm ví dụ trên server.Một vài sự tương tác với sự xuất hiện đối tượng điều khiển từ xa bởi sự chuyển qua proxy.Một đối tượng proxy hành động như một đại diện của đối tượng từ xa và đảm bảo gọi tất cả những cái tạo ra trên proxy để tiến tới đúng đối tượng làm ví dụ.Tất cả phương thức cái mà gọi trên proxy tì tự động chuỷên tiếp tới class từ xa và một vài kết quả trả về cho client.
Từ cái nhìn tổng quát thì truy cập giống như truy cập tạo ra vùng gọi.Một vài cái ngoại lệ được ném ra từ đối tương từ xa .Bởi những ngoại lệ trả ra cho client .Một client có thể sử dụng khối try/catch ở những đoạn cần thiết
Các bứơc xây dựng Remoting
Chúng ta sẽ theo dõi một ví dụ đơn giản:Xây dựng chương trình đảo xâu sử dụng remoting.
Xây dựng giao diện dùng chung cho cả Server và client
-Ở đây chỉ là khai báo các phương thức sẽ được gọi từ xa.
-Dùng chung cho client và server.
VD: Public Interface Ixau
Function Daoxau(ByVal st As String) As String
End Interface
- Chỉ có phần thân không có phần mô tả.
-Dùng để triệu gọi các phương thức khai báo trong server.
-Biên dịch thành .DLL để các server và client tham chiếu đến.
Xây dựng phía Server.(gồm 2 công việc)
*Những thông tin yêu cầu khi bạn đăng ký đối tượng với Remoting framework.
-Tên của đối tượng từ xa.
-Đối tượng URI cái mà client sẽ dùng đối tượng đó.
-Từ hoạt động kích hoạt , cách thức đối tượng thì là cái yêu cầu.
-Phương thức đối tượng có thể sừ dụng là singleton hoặc single call
- Cài đặt các phương thức triệu gọi từ xa nghĩa là triển khai giao diện và kế thừa .
+Tất cả các đối tượng phải được đăng ký với Remoting framework trước khi client có thể truy cập chúng.
+Ghi đè từ các phương thức triệu gọi từ xa.
Class IxauIpm inherits MarshalByrefObject Implements Ixau.IxauIpml
‘xây dựng hàm đảo xâu
Public function Daoxau(byte st as String ) Implements Ixau.IxauIpm.Daoxau
Dim m() as char=st.ToCharArray()
Dim i as Integer =m.length-1
Dim rs as String= “”
Do while i>=0
rs+=m(i)
i=i-1
Loop
End Function
-Đăng ký một đối tượng chứa các phương thức gọi từ xa với một kênh(channel)
+ Kế thừa MarshalByrefObjectv cần Inport
- Add References System.Runtime.Remoting, Interface R;
- System.Runtime.Remoting;
- System.Runtime.Remoting.Chanels;
- System.runtime.remoting.Channles.Http;
+Việc kế thừa từ inherits MarshalByrefObject là bắt buộc
+Khi inport ta tham chiếu tới thư viện của .Net :System.Runtime.Remoting
Cách khởi động Server:
-Tạo một kênh Httpchannel hoặc TcpChannel
HttpChanel chan = new HttpserverChanel(1234);
+Lớp httpserverchannel :Dùng cho server
+Số hiệu cổng để lắng nghe và kết nối từ xa truyền vào kênh thông tin để giao tiếp với client, số hiệu cổng phải được chỉ rõ và phải là cố định.
-Đăng ký nó với Remoting Chanel Server:
ChanelServies.RegisterChanel(Chan,False);
+Lấy thông tin về kiểu của đối tượng chứa các phương thức triệu gọi từ xa
Dim tp As Type = GetType(trienkhai)
-Đăng ký Remote Object với Remoting server:
RemotingConfiguration.RegisterWellKnownServiceType(tp, "cal",
WellKnownObjectMode.Singleton)
Trong đó: +Tham số thứ nhât tp:Kiểu của đối tượng cho phép Remoting
+ Tham số thứ hai cal:Tên của đối tượng cho phép Remoting hay còn gọi là bí danh.
+Tham số thứ 3 kiểu trả lời client của server:có thể là Singleton hoặc single call
Xây dựng phía Client
-Ở phía máy khách : Tham chiêu tới Tệp .dll ta sẽ tham chiếu tới kênh để giao tiếp vơí server.
-Tương tự như server, Ta cũng tạo một Project mới thêm vào những tham chiếu tới giao diện đối tượng từ xa.
-Kế thừa MarshalByrefObject cần Imports:
- System.Runtime.Remoting;
- System.Runtime.Remoting.Chanels;
- System.Runtime.Remoting.Chanels.Http
+Khi inport ta tham chiếu tới thư viện của .Net: System.Runtime.Remoting
-Tạo ra một kênh tương ứng với kiểu kênh của server
Dim chan As New HttpClientChannel
+Lớp httpclientchannel:Dùng cho Client
+Ngược với server, client không cần chỉ rõ số hiệu cổng nghĩa là khởi tạo không tham số để nó tự chọn số hiệu cổng chưa được sử dụng.
-Khai báo một tham chiếu tới giao diện remote
Dim tp As Type = GetType(giaodien.giaodienDX)
Dim rs1 As giaodien.giaodienDX = CType(RemotingServices.Connect(tp, "http://127.0.0.1:1234/cal"), giaodien.giaodienDX)
-Triệu gọi các phương thức:
Console.WriteLine(rs1.Daoxau("XAU CAN DAO"))
Console.ReadLine()
- Tất cả các viêc triệu gọi, đăng ký vào Remoting Chanel Services đều cần bắt lỗi.
- Có thể đưa Remote Object vào Windows Services.