Как удалить объект TcpChannel в .NET

#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.