Недавно я узнал об удаленном взаимодействии, просто чтобы понять его, и обнаружил, что удаленное взаимодействие — действительно хорошая вещь.
Обычно у нас есть три способа использования удаленного взаимодействия, один из них —
первый: публикация общедоступного объекта.
Публичные объекты создаются локально. Второй тип: Удаленное создание публичного объекта (SAO).
Третий тип создания объекта в клиентских запросах: Удаленное создание частного объекта (CAO).
Объект создается на HOST, а клиент ссылается на каталог объекта на сервере.
Я не совсем понимаю существенные различия между этими тремя типами. Способы создания удаленного доступа этих трех методов также различаются.
первый способ
Хозяин:
ChannelServices.RegisterChannel (новый TcpChannel(1500));
cTransfer Trans = новый cTransfer();
RemotingServices.Marshal (Trans, «TestService»);Клиент:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
«tcp://host:1500/TestService»);
Второй способ
Хозяин:
ChannelServices.RegisterChannel (новый TcpChannel(1500));
RemotingConfiguration.RegisterWellKnownServiceType(typeof(cTransfer),
"TestService", WellKnownObjectMode.Singleton);Клиент:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
«tcp://host:1500/TestService»);
Третий способ
Хозяин:
ChannelServices.RegisterChannel (новый TcpChannel(1500));
RemotingConfiguration.RegisterActivatedServiceType(typeof(cTransfer));Клиент:
объект [] attr = {новый UrlAttribute("tcp://host:1500")};
object[] args = {"Пример аргумента конструктора"};
cTransfer T = (cTransfer) Activator.CreateInstance(typeof(cTransfer), args, attr);
Если нам нужен объект, позволяющий обрабатывать удаленные вызовы, то этот объект должен наследовать от класса MarshalByRefObject.
Как передать файлы во время удаленного взаимодействия? Основная идея состоит в том, чтобы открыть файл клиента в клиенте, преобразовать тип Byte[] и затем вызвать объект хоста.
Объекты, передаваемые между клиентом и хостом
[Сериализуемый]
общественная структура kAction
{
общедоступное имя файла строки;
общедоступный контекст байта[];
};Откройте файл и сохраните байты потока в контекст.
Поток fileStream=File.Open(this.transFileName.Text,FileMode.Open);
fileStream.Position=0;
byte[] Content = новый byte[((int) fileStream.Length) + 1];
fileStream.Read(Content,0,Content.Length);
После того, как Хост прочитает Kaction, он сохранит его в указанной папке.
MemoryStream meoeryStream = новый MemoryStream (k_Action.context);
FileStream fileStream=new FileStream(@"d:"+k_Action.filename,FileMode.Create);
meoeryStream.WriteTo(fileStream);
файлПоток.Закрыть();
meoeryStream.Close();
Было обнаружено, что новые объекты не могут быть определены в объекте. При подготовке к отправке на HOST появится сообщение «содержит потенциально опасные типы».
[Сериализуемый]
общественная структура kAction
{
общедоступное имя файла строки;
общедоступный контекст байта[];
public FineInfo fileInfo;//здесь
};
Запишите свои мысли. Когда будет время, разберусь и в следующий раз сделаю полноценную статью.
блоги cnzc