2009-07-06 19 views
6

Tôi đang sử dụng WCF trong .NET 3.5 để triển khai ứng dụng mạng ngang hàng. Để giải quyết các nút ngang hàng tôi đang sử dụng PNRP.WCF ngang hàng với nhau, có nút ngoài kia không?

IGlobalStoreServiceContract là hợp đồng của tôi như hình dưới đây,

[ServiceContract(Namespace = "http://GlobalStoreEventDriven.API", CallbackContract = typeof(IGlobalStoreServiceContract))] 
internal interface IGlobalStoreServiceContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyGlobalStoreDataInserted(string globalGroup, DateTime maxDateTime); 

    [OperationContract(IsOneWay = true)] 
    void RegisterNode(); 

    [OperationContract(IsOneWay = true)] 
    void SynchronizeMemberList(Guid clientId); 
} 

Tôi đang sử dụng một số mã như thế này để tham gia mỗi nút với mạng lưới qua.

DuplexChannelFactory<IGlobalStoreChannel> channelFactory = new DuplexChannelFactory<IGlobalStoreChannel>(instance, "GlobalStoreAPIEndPoint"); 
IGlobalStoreChannel globalStoreChannel = channelFactory.CreateChannel(); 

globalStoreChannel.Open(); 

Câu hỏi của tôi là ngay sau khi tôi đã mở kênh làm cách nào để tôi có thể biết rõ nhất liệu các mạng ngang hàng khác có trên mạng không?

Ví dụ tôi có thể gọi một trong các phương thức trong RegisterNode hợp đồng của tôi và mỗi nút trong mạng có thể sử dụng gọi lại để gọi SynchronizeMemberList. Sau đó tôi sẽ biết liệu các nút khác có ở đó không.

Sự cố với điều đó là tất cả đều không đồng bộ. Nếu tôi gọi RegisterNode và không có ai trả lời, nó không thực sự có nghĩa là không có ai ở đó, nó chỉ có nghĩa là tôi đã không chờ đợi đủ lâu.

Bạn nghĩ gì? Bất kỳ đề xuất?

Trả lời

5

Xem Peer-to-Peer Programming with WCF and .NET Framework 3.5: Peer Name bởi Amit Bahree và Chris Peiris:

Bước logic thức sau khi tạo và xuất bản một peer được giải quyết một peer . Điều gì là tốt để xuất bản điều gì đó cho đám mây nếu một người ngang hàng khác không thể tìm thấy bạn? Chúng tôi sử dụng lớp học PeerNameResolver để giải quyết cho một đồng đẳng cụ thể trong một đám mây nhất định. PeerNameResolver có thể phân giải ngang hàng thành hoặc PeerRecord hoặc một đám mây, tùy thuộc vào các thông số được chuyển. Quá trình giải quyết hoàn thành hoặc khi số lượng tối đa số mục nhập kỷ lục cho PeerRecordCollection đạt hoặc khi nó đã kết thúc các đám mây khác nhau.

Lớp PeerNameResolver cho thấy phương thức quá tải được gọi là Resolve và được sử dụng để giải quyết đồng đẳng nhất định.

Liệt kê 17 cho chúng ta biết cách giải quyết cho một người ngang hàng được gọi là MySecurePeer. Phương thức Resolve trả về một tập hợp kiểu PeerNameRecordCollection mà qua đó chúng ta lặp lại. Liệt kê 18 cho thấy kết quả của việc này khi chạy trên một máy tính có ba card mạng.

PeerName myPeer = new PeerName("MySecurePeer", PeerNameType.Secured); 
PeerNameResolver resolver = new PeerNameResolver(); 

PeerNameRecordCollection results = resolver.Resolve(myPeer); 

Console.WriteLine("{0} Peers Found:", results.Count.ToString()); 
int i = 1; 

foreach (PeerNameRecord peer in results) 
{ 
    Console.WriteLine("{0} Peer:{1}", i++, peer.PeerName.ToString()); 
    foreach (IPEndPoint ip in peer.EndPointCollection) 
    { 
     Console.WriteLine("\t Endpoint: {0}", ip.ToString()); 
    } 
} 

Vì vậy, tôi đoán bạn nên kiểm tra PeerNameResolver.Resolve Method:

phương pháp này liên kết ngang tên để đám mây. Gọi phương thức PeerNameResolver tương tự như gọi phương thức Resolve cho mỗi tên ngang hàng ghi trong PeerNameRecordCollection.Lưu ý rằng bằng cách sử dụng phương thức Resolve trên bản ghi tên ngang hàng cá nhân không giải quyết vô hiệu hóa nhiều tên ngang hàng tên.

Đối với mọi phương thức Resolve, có phương thức tương đương ResolveAsync. Chúng giống hệt nhau trong các tham số mà chúng được chuyển, ngoại trừ phương pháp ResolveAsync bao gồm một mã thông báo của hệ thống trong danh sách tham số xử lý sự kiện không đồng bộ.

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