请问用Remoting有办法可以让服务器直接与客户端通信吗。
我指的是:如有一个服务器,三台客户端。我想让服务器"这次"直接把对象传给"机器二"[就好象进程的显式调用那样而不是经过中转器或在每个客户端那处理到底该批数据让哪个客户端执行]

解决方案 »

  1.   

    再简单的说就是:怎样用Remoting实现服务端根据指定IP地址,给指定客户端发送信息。
      

  2.   

    1、序列化对象
    2、通过TCP或UDP网络编程把序列化的二进制发送给客户端
    3、反序列化对象
      

  3.   

    问题是: 怎样用Remoting实现服务端根据指定IP地址,给指定客户端发送信息
    是不是获取各个客户端的远程对象?还是??
      

  4.   

    Remoting WebService 都是拉模式
      

  5.   

    客户端登陆服务器时,创建CAO对象(CAO就是客户端激活对象),在CAO对象中添加事件和其他客户端相关的信息,客户端订阅自己的CAO对象的事件,服务端根据CAO对象中的客户端信息,有选择的把消息发给CAO对象,触发CAO对象的事件
    (因为是每个客户端只订阅了自己CAO对象的事件,所以是有选择的传播消息)
      

  6.   

    To: vwxyzh 
    有例子吗?觉得有道理
      

  7.   

    这个实现比较复杂,先去看一下CAO的相关知识,Google一下,一般我用的是一个SAO的工厂对象去创建一个CAO对象方式。
    另外,需要客户端去定期激活CAO对象(简单点的话,可以直接用ClientSponsor)然后要看一下Remoting里面怎么用事件,这个也有点烦,因为事件是反向的引用,也就是客户端订阅事件的对象必须是可以Remoting的,需要小心一点关于配置,做Remoting的应该都没什么问题吧
      

  8.   

    参看:
    http://www.cnblogs.com/artech/archive/2007/03/01/660595.html
      

  9.   

    CAO部分参看:
    http://blog.csdn.net/johnsonTj/archive/2005/04/24/360518.aspx
    重点看其中的混合法
      

  10.   

    以前在msdn上有一遍讲这个的好文章,现在找不到了
      

  11.   

    还是搞不出来..
    继续求助..怎样用Remoting实现服务端根据指定IP地址,给指定客户端发送信息.
      

  12.   

    远程回调比较复杂,你还不如用互为服务器的remoting,比如:
    你的服务器叫做A,客户端叫B1、B2等,A、Bx都有remoting服务端,Bx连接A的时候,就把自己的连接地址告诉A,
    这样A想往客户端Bx发送东西的时候,就去连接Bx的remoting服务并调用。
      

  13.   

    可以,不过要做一些工作.首先保证你要传输的对象是可串行化的.其次要有一个中间类(用它来实现回调),该类(Publisher)必须是可跨进程访问的,也就是说必须派生自System.MarshalByRefObject.然后客户端调用Publisher中的方法,通过TcpChannel向服务端进行订阅,服务端监听到订阅后也调用Publisher的方法进行发布,发布的同时所有的订阅的客户端都会产生一个回调,这样就知道服务端发消息了.其实所有客户端在与服务端共享一个Publisher的实例而要传输的对象也话这个实例当中.
    服务端:
    ///创建一个通道实例,该通道使用端口8090
    Channel = new TcpChannel( 8090 );
    ///注册通道 
    ChannelServices.RegisterChannel( Channel );
    RemotingConfiguration.RegisterWellKnownServiceType( typeof( Publisher ), "PublishSubscribe", WellKnownObjectMode.Singleton );
    NewPublisher = ( Publisher )Activator.GetObject( typeof( Publisher ), "tcp://localhost:8090/PublishSubscribe" ); 客户端:
    /// 创建一个通道监听回调
    /// 端口号为0允许系统监听所有的通道,在这里不能指定端口8090。
    ClientChannel = new TcpChannel( 0 );
    ///注册客户通道
    ChannelServices.RegisterChannel( ClientChannel );
    ///通过通道获得发布者对象
    NewPublisher = ( Publisher )Activator.GetObject( typeof( Publisher ), "tcp://localhost:8090/PublishSubscribe" ); 
      

  14.   

    To:liuzuofei  六月雪
    看你之前发了回过一个贴不是说你已经实现过这样的东西吗?发一份给我参考下..我这几天非搞明白它不可```
      

  15.   

    各位看看这个类:
     public class SerialRunObj : MarshalByRefObject, ISerialRun
        {
            public event SerialRunEventHandler SerialRunEven;        public void SerialRunInfo(Machine info)
            {
                if (SerialRunEven != null)
                {
                    SerialRunEventHandler tempEvent = null;                int index = 1;
                    foreach (Delegate del in SerialRunEven.GetInvocationList())
                    {
                        try
                        {
                            tempEvent = (SerialRunEventHandler)del;
                            tempEvent(info);
    //在这可控制给指定某一客户端发信息..但我怎么知道del委拖对象是属于哪个客户端的?
                        }
                        catch
                        {
                            MessageBox.Show("客户端" + index.ToString() + "断开!");
                            SerialRunEven -= tempEvent;
                        }
                        index++;
                    }
                }        }