.Net Remoting问题(C#)

时间:2009-06-30 21:25:30

标签: c# .net remoting

我正在使用.Net Remoting并尝试访问服务器中修改的远程对象,这里是对象def: 我的想法是,我在服务器上创建的MRB对象返回到客户端,并在客户端调用getString()时打印出“Set On Server”。

我现在得到的是客户端上的空字符串,因此在客户端上调用new时,MRB对象不会发送到客户端。 对不起所有不同的班级等,但这是唯一的方法,我尽可能地修剪。

我真正想要的是在运行时在客户端上打印“设置在服务器上”

using System;
using System.Runtime.Remoting.Lifetime;
namespace RemoteType
{
    public class MyRemoteObject : System.MarshalByRefObject
    {
        private string sharedString;
        public string getString()
        {
            return sharedString;
        }
        public void setString(string value)
        {
        sharedString = value;
        }   
        public MyRemoteObject()
        {
            Console.WriteLine("MyRemoteObject Constructor Called");
        }

        public override object InitializeLifetimeService()
        {
            return null;
        }
        public string Hello()
        {
            return "Hello, Welcome to .Net Remoting !";
        }
    }

知道这是服务器:

using System;
using System.Runtime.Remoting;
using RemoteType;
namespace SimpleServer
{
    class SimpleServer
    {
        public static MyRemoteObject MRB = null;
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("RemotingAppServer.exe.config");
            MRB = new MyRemoteObject();
            MRB.setString("Set on the server");
            Console.WriteLine(MRB.getString());
            RemotingServices.Marshal((MRB), "MyRemoteObject");
            Console.WriteLine("Press return to exit");
            Console.ReadLine();
        }
    }

.NET Remote Config App.Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" port="8000" />
            </channels>
            <service>
                <wellknown mode="Singleton" 
                type="RemoteType.MyRemoteObject, RemoteType"
                objectUri="MyRemoteObject" />
            </service>
        </application>
    </system.runtime.remoting>
</configuration>

最后是客户:

using System;
using System.Runtime.Remoting;
using RemoteType;
namespace SimpleClient
{
    class SimpleClient
    {
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("RemoteClient.exe.config");
            MyRemoteObject robj = new MyRemoteObject();
            Console.WriteLine(robj.Hello() + " " + robj.getString());
            Console.ReadLine();
        }
    }
}

它的配置也是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application name = "SimpleClient">
            <client>
                <wellknown
                type="RemoteType.MyRemoteObject,RemoteType"
                url="tcp://localhost:8000/MyRemoteObject"/>
            </client>
            <channels>
                <channel ref="tcp" port="0"/>
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

3 个答案:

答案 0 :(得分:2)

我测试了你的代码并且工作得很好。我确实设置了三个项目,一个是服务器,另一个是客户端,第三个是服务器和客户端共享的远程对象。 在远程app.config中,您可以删除已知条目,因为您已经通过代码对其进行编组。

答案 1 :(得分:0)

您确定应用程序结束后您的套接字会立即关闭吗?

如果快速测试多次,可能会导致tcp通信问题

答案 2 :(得分:0)

防火墙是否可以阻止环境中的tcp端口8000?您可以尝试切换到http作为测试。