2011-04-09 48 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。