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

本文关键字:客户端 方法 调用 服务器 Remoting net | 更新日期: 2023-09-27 18:10:39

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

"远程代理服务器上的代理服务器上的代理服务器上的注册服务器上的代理服务器上的注册服务器上的代理服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器上的注册服务器"

翻译成

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

我该如何改变这一点?

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

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

谢谢你对我的帮助

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

我很久以前就放弃了真正的。net远程操作,转而使用WCF。最近我一直在使用RemotingLite和我自己的版本,它也支持名为DuoVia.Net的命名管道。您只需编写接口契约和DTO,在客户机和服务器上的程序集中共享它们,并在服务器端编写实现。

没有客户端生产。这些库通过反射和动态汇编生成来生成它们自己的库。很酷的东西。看看客户端是多么容易:

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();
    }
}

玩得开心!