2013-02-21 37 views
5

Tính năng Net Remoting có mở nhiều kết nối hay chỉ một kết nối không? giả sử tôi có máy chủ và ứng dụng khách. nếu khách hàng tạo nhiều đối tượng SingleCall. thì đối với mọi đối tượng là sẽ có một kết nối mới hoặc sẽ có một kết nối duy nhất cho mọi đối tượng?. Net Remoting chỉ sử dụng một kết nối?

Tôi không thể tìm thấy câu trả lời ở bất cứ đâu.

+2

Tôi nghĩ rằng nó sẽ phụ thuộc vào (các) kênh nào đang được sử dụng, nhưng * tại sao * bạn có đang viết mã từ xa vào năm 2013 không? –

+0

@Damien_The_Unbeliever anh ấy có thể đang làm việc trên một dự án cũ. ý bạn là gì tùy thuộc vào kênh? kênh xác định điều đó? – m1o2

Trả lời

0

Số lượng kết nối mạng phụ thuộc vào kênh từ xa bạn sử dụng. TcpChannel mặc định sẽ mở ra nhiều kết nối mạng vì nhiều luồng trong chương trình của bạn cố gắng truy cập vào máy chủ trong một thời điểm.

Đối với các ứng dụng đơn luồng, TcpChannel sử dụng một kết nối mạng.

Ví dụ ngược lại, kênh từ xa của bên thứ ba IiopChannel sử dụng ghép kênh và do đó cho phép chỉ có một vài kết nối mạng cho hàng trăm chủ đề đang hoạt động.

7

Câu trả lời dài là: tùy thuộc vào nhiều thứ. Câu trả lời ngắn gọn là có. Vâng vâng.

Hãy thử nghiệm và xem tình huống mặc định phổ biến nhất. Chúng tôi có 2 ứng dụng giao diện điều khiển và 1 thư viện lớp phổ biến được giới thiệu bởi cả hai ứng dụng giao diện điều khiển. Ứng dụng giao diện điều khiển thứ nhất có vai trò của máy khách và ứng dụng thứ hai có vai trò của máy chủ.

Thứ nhất, đây là những gì thường phụ thuộc vào thư viện lớp chứa:

public interface IFactory { 

    string Hello(string name); 

} 

Bây giờ cho một số mã máy chủ. Dưới đây là những khởi động:

private static TcpChannel channel; 

static void Main(string[] args) { 

    BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider(); 
    BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider(); 
    serverProv.TypeFilterLevel = TypeFilterLevel.Full; 

    channel = new TcpChannel(
    properties: new Hashtable { 
     { @"port", 2013 } 
    }, 
    clientSinkProvider: clientProv, 
    serverSinkProvider: serverProv 
); 
    ChannelServices.RegisterChannel(channel, false); 
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(Factory), "Factory.rem", WellKnownObjectMode.SingleCall); 

    Console.WriteLine("Server started..."); 
    Console.WriteLine("Press any key to stop..."); 
    Console.ReadKey(intercept: true); 

} 

Chúng tôi chỉ đề cập đến một lớp được gọi là Factory.

RemotingConfiguration.RegisterWellKnownServiceType(typeof(Factory), "Factory.rem", WellKnownObjectMode.SingleCall); 

Bạn đã đoán. Đó là IFactory thực hiện:

private sealed class Factory : MarshalByRefObject, IFactory { 

    #region IFactory Members 

    string IFactory.Hello(string name) { 
    return @"Hello " + name + @" !"; 
    } 

    #endregion 

} 

Bây giờ đối với một số khách hàng:

static void Main(string[] args) { 

    Console.WriteLine("Press any key to connect..."); 
    Console.ReadKey(intercept: true); 

    IFactory factory = Activator.GetObject(typeof(IFactory), @"tcp://127.0.0.1:2013/Factory.rem") as IFactory; 

    EventWaitHandle signal = new EventWaitHandle(initialState: false, mode: EventResetMode.ManualReset); 

    ThreadStart action =() => { 

    signal.WaitOne(); 
    var result = factory.Hello("Eduard"); 
    Console.WriteLine(result); 

    }; 

    foreach (var i in Enumerable.Range(0, 99)) 
    new Thread(action) { IsBackground = true }.Start(); 

    Console.WriteLine("Press any key to bombard server..."); 
    Console.ReadKey(intercept: true); 

    signal.Set(); 


    Console.ReadKey(intercept: true); 
} 

Bạn đã biết tất cả những điều này, tôi chắc chắn. Chúng tôi có được một proxy trong suốt đối với các dịch vụ SingleCall ở phía bên kia (họ đang cả hai trên cùng một máy và chúng tôi đang sử dụng cổng TCP 2013):

IFactory factory = Activator.GetObject(typeof(IFactory), @"tcp://127.0.0.1:2013/Factory.rem") as IFactory; 

Sau đó, vì lý do "simulataneous-Ness" chúng ta tạo ra 100 chủ đề, bắt đầu họ (có thể mất một thời gian), nhưng "giữ chúng trong một dây xích" (một tín hiệu là một phương tiện thiết yếu của đồng bộ của hệ điều hành) cho đến khi chúng ta "bóp cò":

EventWaitHandle signal = new EventWaitHandle(initialState: false, mode: EventResetMode.ManualReset); 

ThreadStart action =() => { 

    signal.WaitOne(); 
    var result = factory.Hello("Eduard"); 
    Console.WriteLine(result); 

}; 

foreach (var i in Enumerable.Range(0, 99)) 
    new Thread(action) { IsBackground = true }.Start(); 

Vì vậy, mặc dù tất cả 100 chủ đề đã được tạo bắt đầu, tất cả chúng đều chờ trong lời gọi sau:

signal.WaitOne(); 

Bằng cách đó chúng ta có thể có được để bắt đầu cùng lúc tốt hơn, nếu không sáng tạo và khởi đầu của chủ đề riêng của mình đã có thể làm thực hiện thực tế của họ nhiều hay ít tuần tự.

Chúng tôi yêu cầu người sử dụng để quyết định khi nào thì "bắn phá máy chủ" với 100 Xin chào lời gọi:

Console.WriteLine("Press any key to bombard server..."); 
Console.ReadKey(intercept: true); 

signal.Set(); 

Và đây là những gì sẽ xảy ra:

1) Chúng tôi bắt đầu máy chủ console app và để cho nó chạy trong hòa bình:

enter image description here

2) Chúng tôi bắt đầu client console app, "tạo kết nối" bằng cách nhấn phím bất kỳ (đó là chỉ một kết nối logic vì nó chỉ tạo ra một proxy trong suốt) nhưng chúng tôi trì hoãn việc "bắn phá":

enter image description here

3) Chúng tôi khởi động Mark Russinovich Process Explorer và sử dụng nó để khám phá khách hàng quá trình trong danh sách xử lý, và trong khi làm điều đó chúng tôi mở nó cửa sổ thuộc tính và chọn TCP/IP tab:

enter image description here

4) Chúng tôi nhấn phím bất kỳ trong ứng dụng ứng dụng khách console và .. TA DAA !! Bạn nhận được nhiều liên kết trong số Process Explorer. Họ là một trăm? Lúc có lúc không. Đó là một hồ bơi kết nối, đó là chắc chắn. Sau một thời gian ngắn (5 đến 10 giây) sự biếng nhác mà chúng đóng lại, đó là một điều rất tốt (vì ngăn xếp .NET Remoting được thực hiện theo cách đó).

enter image description here

Tôi hy vọng thí nghiệm này thường trả lời câu hỏi của bạn.

Trong trường hợp cụ thể hơn và theo nghĩa nghiêm ngặt hơn, bạn nên kiểm tra tài liệu và đọc về các kênh khác nhau mà bạn có thể sử dụng trong các ứng dụng .NET Remoting của bạn. đây chỉ là TcpChannel thông thường được Microsoft cung cấp chính thức, nó phụ thuộc vào cấu hình .NET Remoting của bạn nói về việc bạn đang lưu trữ máy chủ trong IIS hay không, vv).

+0

đây là một câu trả lời hoàn toàn tuyệt đẹp. Cảm ơn bạn! – Quibblesome

Các vấn đề liên quan