2011-04-09 49 views
2

我在TcpChannel中遇到了一些麻烦。我想创建一个频道,远程访问一个对象,比方说,一台服务器,并在完成所有这些后关闭频道。问题是我可能需要稍后在相同的端口重新打开相同的频道,而且我很难尝试这样做。如何删除.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

在此先感谢。

+0

您是否在同一应用程序的不同会话或同一会话中重新打开它时遇到问题?如果是后者,您可以在应用程序启动时打开频道,然后在应用程序关闭时关闭/取消注册。 – 2011-04-09 18:36:40

+0

@Paul Sasik我有麻烦,因为tcpChannel只在所有连接都关闭后才关闭,所以我需要结束所有访问到我的远程对象。我想我可以通过做Remoting.Disconnect(object)来做到这一点,但它似乎没有与已经共享的远程对象一起工作,我必须手动完成。我现在会尽力去做。感谢您的全力支持,我对您的所有支持以及您帮助我们的速度感到惊叹。 – matutano 2011-04-10 13:32:14

回答

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; 
    } 
+0

代码正在工作,并且TcpChannel正在“关闭”。但是,当我尝试做channel = new TcpChannel(oldPort);它会抛出一个异常,指出tcpChannel中的端口是独占的。不知何故,tcpChannel没有关闭... – matutano 2011-04-09 21:04:23

+0

@matutano:没有错误,我关闭并重新打开没有错误(当我试图打开两次,我收到你的错误) – Avram 2011-04-09 21:15:24

+0

@matutano我的意思是它的工作时没有远程服务器连接,所以问题是断开远程服务器第一。 – Avram 2011-04-09 21:27:09

0

如果您只想停止并开始在同一端口上侦听,则需要明确呼叫start listening。在StopListening之后,您可以丢弃最后三行代码,并保留并重用该对象,直到应用程序关闭。

channel = new TcpChannel(port); 
channel.StartListening(data) 
+0

感谢您的答复。我真的必须关闭tcp连接。我有一组由另一个实体控制的服务器。这个实体命令这组服务器打开和关闭一些连接。当那个“主”实体命令一个服务器打开一个以前打开的tcpChannel时,我的问题就出现了。我真的必须紧密联系。 – matutano 2011-04-09 20:14:06

0

您将需要设置channel属性:exclusiveAddressUse为false。