Я пытаюсь создать серверное клиентское приложение, чтобы узнать больше об удаленных программах с использованием c #.
Структура довольно проста.
У меня есть сервер, который вызывает событие, когдаВызывается функция updateInventory, и каждый клиент регистрирует функцию на событие (используя делегата).
Таким образом, когда любой клиент обновляет инвентарь (вызывая функцию updateInventory), все клиенты получают предупреждение об этом посредством события.
Теперь проблема в том, что он просто не работает, когда клиент вызывает функцию updateInventory, а функция на сервере не вызывается.
Программа имеет следующие 4 компонента:
inventoryChangedArgs
, который является Сериализуемым и служит аргументом для функции, вызванной событием.Я скомпилировал его в .dll и использовал на сервере и клиенте «добавить ссылку ...»:
using System;
[Serializable]
public class InventoryChangeArgs:EventArgs
{
private string pno;
public string Pno
{
get
{
return pno;
}
set
{
pno = value;
}
}
private int change;
public int Change
{
get
{
return change;
}
set
{
change = value;
}
}
public InventoryChangeArgs(string pno, int change)
{
Console.WriteLine("InventoryChangeArgs constructed");
this.pno = pno;
this.change = change;
}
}
InventoryManager
, который объявляет делегата, событие и состояния, когда вызвать событие.Клиентская сторона имеет тот же класс, с той лишь разницей, что содержимое UpdateInventory является нулевым ... все остальное одинаково.
public class InventoryManager:MarshalByRefObject
{
public delegate string InventoryChangeHandler(object sender, InventoryChangeArgs info);
public event InventoryChangeHandler Changed;
public void UpdateInventory(string pno, int change)
{
Console.WriteLine("UpdateInveroty has been invoced");
if (change == 0)
Console.WriteLine("No changed event");
else if (Changed != null)
{
Changed(this, new InventoryChangeArgs(pno, change));
Console.WriteLine("Changed event");
}
}
}
Функция события на стороне клиента Добавляетк событию функция Wan и устанавливает Remoting Configuration:
class Client
{
static void Warn(object sender,InventoryChangeArgs args)
{
Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
}
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config",false);
InventoryManager inv=new InventoryManager();
inv.Changed+=new InventoryManager.InventoryChangeHandler(Warn);
Console.WriteLine("Client started");
inv.UpdateInventory("102", 2);
Console.ReadLine();
}
}
Удаленный файл конфигурации Это удаленный файл конфигурации для клиента, сервер почти такой же, за исключениемследующие строки:
...
<application name="Server">
<service>
<wellknown
mode="Singleton"
type="InventoryManager, InventoryManager"
objectUri="InventoryManager" />
</service>
...
<channel ref="tcp" port="9000">
...
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown
type="InventoryManager, InventoryManager"
url="tcp://localhost:9000/Server/InventoryManager"
/>
</client>
<channels>
<channel ref="tcp" port="0">
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
Если бы кто-нибудь мог мне помочь, я был бы очень признателен.Заранее спасибо