Проблема с .Net Remoting (C #)

2

Я использую .Net Удаляя и пытающийся получить доступ к удаленному объекту, модифицированному на Сервере, вот объект def: Идея заключается в том, что объект MRB, который я создаю на сервере, возвращается клиенту, и "Set On Server" распечатывается, когда на клиенте вызывается getString().

Теперь я получаю нулевую строку на клиенте, поэтому объект 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>
Теги:
remoting

3 ответа

2
Лучший ответ

Я проверил ваш код и отлично работал. Я установил три проекта: один с сервером, другой с клиентом и третий, разделяемый между сервером и клиентом для удаленного объекта. В удаленном app.config вы можете удалить известную запись, поскольку вы уже сортируете ее по коду.

  • 0
    Вы видели «Установить на сервере», напечатанные на клиенте, когда клиент работает?
  • 0
    @daniel: Вы настроили проект для одновременного запуска сервера и клиента? Если да, возможно, может помочь добавление Thread.Sleep в начале клиентского кода.
Показать ещё 2 комментария
0

Может ли брандмауэр блокировать tcp-порт 8000 в вашей среде? Вы можете попробовать перейти на http как тест.

0

Вы уверены, что ваши сокеты закрываются, как только приложение заканчивается?

Если вы тестируете несколько раз быстро, это может привести к проблемам связи с tcp.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню