#c# #.net #network-programming
#c# #.net #сетевое программирование
Вопрос:
У меня возникли некоторые проблемы с TcpChannel
. Я хочу создать канал, предоставить удаленный доступ к объекту, скажем, серверу, и после выполнения всего этого закрыть канал. Проблема в том, что мне, возможно, потребуется повторно открыть тот же канал позже, на том же порту, и у меня возникают некоторые трудности, пытаясь это сделать.
для целей подключения я делаю только:
var channel = new TcpChannel(port);
Console.WriteLine("Start Connection received at Server");
ChannelServices.RegisterChannel(channel, false);
//Initiate remote service as Marshal
RemotingServices.Marshal(this, "Server", typeof(Server));
затем, чтобы закрыть его, я просто делаю:
Console.WriteLine("Stop Connection at Server");
channel.StopListening(null);
RemotingServices.Disconnect(this);
ChannelServices.UnregisterChannel(channel);
channel = null;
После этого, если я пытаюсь создать новый экземпляр TcpChannel, я получаю исключение, в котором говорится, что соединения TcpChannel уникальны, они должны быть на разных портах.
Итак, как я могу закрыть TcpChannel? :S
Заранее спасибо.
Комментарии:
1. У вас возникли проблемы с его повторным открытием между разными сеансами одного и того же приложения или в одном и том же сеансе? Если это последнее, вы могли бы просто открыть канал при запуске приложения, а затем закрыть / отменить регистрацию, когда приложение завершит работу.
2. @Paul Sasik У меня возникли проблемы, потому что TcpChannel закрывается только после закрытия всех подключений, поэтому мне нужно завершить все обращения к моему удаленному объекту. Я думал, что смогу сделать это с помощью удаленного взаимодействия. Отключить (object), но, похоже, это не работает с уже разделяемыми удаленными объектами, я должен сделать это вручную. Я попытаюсь сделать это сейчас. Спасибо за всю вашу помощь, я был польщен вашей поддержкой и тем, как быстро вы помогли нам.
Ответ №1:
ваш код закрытия работает.
перепроверьте журналы, вы где-то пропустили «Остановить соединение на сервере».
Обновить:
вот мой журнал (без ошибок):
Начать соединение, полученное на сервере,
Остановить соединение на сервере,
Запустить соединение, полученное на сервере,
Остановить соединение на сервере
там код реализации:
private void button1_Click(object sender, EventArgs e)
{
channel = new TcpChannel(port);
Trace.WriteLine("Start Connection received at Server");
ChannelServices.RegisterChannel(channel, false);
//Initiate remote service as Marshal
RemotingServices.Marshal(this, "Server", typeof(Server));
}
private void button2_Click(object sender, EventArgs e)
{
Trace.WriteLine("Stop Connection at Server");
channel.StopListening(null);
RemotingServices.Disconnect(this);
ChannelServices.UnregisterChannel(channel);
channel = null;
}
Комментарии:
1. Код работает, и TcpChannel «закрывается». Однако, когда я пытаюсь выполнить channel = new TcpChannel(oldPort); он выдает исключение, в котором говорится, что порты в TcpChannel являются эксклюзивными. Почему-то TcpChannel не закрывается…
2. @matutano: ошибок нет, я закрыл и повторно открыл без ошибок (и когда я пытаюсь открыть дважды, я получаю вашу ошибку)
3. @matutano я имею в виду, что он работает, когда удаленные серверы не подключены, поэтому проблема в том, чтобы сначала отключить удаленные серверы.
4. Я просто думал об этом, этот код действительно работает, и это потому, что к нему не подключены никакие удаленные серверы. Я попытался сделать то же самое, запустив набор серверов, к которым подключен только один (так что не было ни одного объекта, подключенного удаленно), и это сработало отлично, не было предоставлено RemotingServices. Отключиться, чтобы завершить работу всех удаленных служб?
Ответ №2:
Если вы просто хотите остановить и начать прослушивание на том же порту, вам нужно явно вызвать start listening. Вы можете удалить последние три строки кода после stopListening и сохранить и повторно использовать объект до тех пор, пока ваше приложение не выйдет из строя.
channel = new TcpChannel(port);
channel.StartListening(data)
Комментарии:
1. Спасибо за ваш ответ. Я действительно должен закрыть tcp-соединение. У меня есть набор серверов, которыми управляет другой объект. Это объект, который приказывает этому набору серверов открывать и закрывать некоторые соединения. Моя проблема возникает, когда этот «главный» объект приказывает серверу открыть TcpChannel, который был открыт ранее. Я действительно должен закрыть соединения.
Ответ №3:
Вам нужно будет установить для свойства канала: exclusiveAddressUse значение false.