繁体   English   中英

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

[英].Net Remoting: Invoke Method on client from Server

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

“Der Remoteproxy hat keine Channelsenke,dh,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进行方法调用。

非常感谢帮助我

很久以前,我放弃了对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();
    }
}

玩得开心!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM