Я использую .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>
Я проверил ваш код и отлично работал. Я установил три проекта: один с сервером, другой с клиентом и третий, разделяемый между сервером и клиентом для удаленного объекта. В удаленном app.config вы можете удалить известную запись, поскольку вы уже сортируете ее по коду.
Может ли брандмауэр блокировать tcp-порт 8000 в вашей среде? Вы можете попробовать перейти на http как тест.
Вы уверены, что ваши сокеты закрываются, как только приложение заканчивается?
Если вы тестируете несколько раз быстро, это может привести к проблемам связи с tcp.