.Net Remoting:从服务器上调用客户端上的方法

时间:2013-04-24 16:13:17

标签: c# .net remoting

我正在尝试使用C#中的.Net Remoting编写一个小型聊天服务器。 从客户端到服务器的连接工作得很好,但是一旦我尝试将发送的消息“广播”到所有其他客户端(甚至是同一个客户端),服务器就会抛出异常。

“Der Remoteproxy hat keine Channelsenke,d。h。,der Server besitzt keine registrierten Serverchannel oder die Anwendung hat keinen passenden Clientchannel,um mit dem Server zu kommunizieren。”

什么转化为

“此远程处理代理没有通道接收器,这意味着服务器没有正在侦听的已注册服务器通道,或者此应用程序没有合适的客户端通道与服务器通信。”

我将如何更改此内容?

在这里(https://www.dropbox.com/s/y40cdv3lopsf6d7/Chatprojekt.zip)你可以找到完整项目的副本,但是为了帮助其他有相同问题的人,我会解释我做了什么。

在服务器上,我在特定端口上打开了一个TcpChannel,为服务器和客户端建立了一个接口。我连接到服务器并使用方法,我将客户端实例传递给服务器。 接口的两个实现都实现MarshalByRefObj以使用Proxies进行方法调用。

非常感谢帮助我

1 个答案:

答案 0 :(得分: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();
    }
}

玩得开心!