2013-04-24 193 views
0

我正在嘗試在C#中使用.Net Remoting編寫一個小型聊天服務器。 從客戶端到服務器的連接工作得很好,但只要我嘗試向所有其他客戶端(甚至是同一客戶端)「廣播」發送的消息,服務器就會引發異常。.Net Remoting:從服務器調用客戶端上的方法

「Der Remoteproxy hat keine Channelsenke,d。h。,der Server besitzt keine registrierten Serverchannel or die Anwendung hat keinen passenden Clientchannel,and mit dem Server zu kommunizieren。」

什麼轉化爲

「這個遠程代理不具有信道接收器,這意味着在服務器具有被監聽沒有註冊的服務器信道,或該應用程序沒有合適的客戶端的信道進行通話的服務器」。

我會如何改變這種情況?

這裏(https://www.dropbox.com/s/y40cdv3lopsf6d7/Chatprojekt.zip)你可以找到整個項目的副本,但爲了幫助其他有同樣問題的人,我會解釋我做了什麼。

在服務器上,我在特定的端口上打開了一個TcpChannel,爲服務器和客戶端都創建了一個接口。我連接到服務器和方法,我將客戶端實例傳遞給服務器。 接口的兩個實現都實現MarshalByRefObj以使用代理來進行方法調用。

由於已經有很多幫助我

+1

爲什麼使用Remoting?它已經過時和報廢。 – 2013-04-24 16:16:40

+0

你還會建議什麼? Servicestack? WCF?我認爲這是一個很好的練習 – 2013-04-24 16:23:51

+0

WCF或者WebAPI – 2013-04-24 16:27:16

回答

2

我放棄了在很久以前有利於WCF的做實際的.NET遠程。最近我一直在使用RemotingLite和我自己的變體,它也支持名爲DuoVia.Net的命名管道。您只需編寫接口協議和DTO,在客戶端和服務器的程序集中共享這些協議,並在服務器端編寫實現。

沒有客戶生產。這些庫通過發射IL產生自己的反射和動態裝配生成。很酷的東西。看看客戶端有多容易:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var sw = Stopwatch.StartNew(); 
     var ipEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8098); 

     var from = 0; 
     var to = 500; 
     Parallel.For(from, to, index => 
     { 
      using (var client = new NetTcpTesterProxy(ipEndpoint)) 
      { 
       var id = client.GetId("test1", 3.314, 42); 
       var response = client.Get(id, "mirror", 4.123, 42); 
       var list = client.GetItems(id); 
      } 
     }); 
     sw.Stop(); 
     var msperop = sw.ElapsedMilliseconds/1500.0; 
     Console.WriteLine("tcp: {0}, {1}", sw.ElapsedMilliseconds, msperop); 

     Thread.Sleep(5000); 

     var pipeName = "DuoViaTestHost"; 
     sw = Stopwatch.StartNew(); 
     Parallel.For(from, to, index => 
     { 
      using (var client = new NetNpTesterProxy(new NpEndPoint(pipeName))) 
      { 
       var id = client.GetId("test1", 3.314, 42); 
       var response = client.Get(id, "mirror", 4.123, 42); 
       var list = client.GetItems(id); 
      } 
     }); 
     sw.Stop(); 
     msperop = sw.ElapsedMilliseconds/1500.0; 
     Console.WriteLine("pip: {0}, {1}", sw.ElapsedMilliseconds, msperop); 

     Console.ReadLine(); 
    } 
} 

玩得開心!

相關問題