2016-09-18 103 views
0

我正在使用NetMQ套接字來執行客戶端 - 服務器通信。我有一臺監聽端口5555和一臺客戶端的服務器,即.bind() -s。如何確定客戶端套接字的連接狀態?

這裏是我的代碼示例:

using (NetMQContext ctx = NetMQContext.Create()) 
{ 
    using (var client = ctx.CreateRequestSocket()) 
    {        
      client.Connect("tcp://127.0.0.1:5555");        
      client.SendFrame(jData);        
    } 
} 

我想這樣做是爲了傳達給用戶,如果客戶端沒有找到任何服務器偵聽到該端口。

實際發生的事情是,如果沒有服務器正在偵聽該端口,則不會引發異常,並調用.sendFrame()並導致應用程序崩潰。

是否有任何方法,如異常或狀態碼,可以告訴我,如果連接成功或不?

+0

你可以要求連接的屬性,這將強制連接創建或失敗。例如,你可以要求從本地客戶端的TCP/IP連接ID,這可能會強制連接打開 –

+0

我試圖找到一些屬性或方式來溝通,如果連接不可能。根據我的理解,zeromq/netmq框架沒有通知。無論客戶端還是服務器先連接,圖書館都會嘗試儘可能地連接 – Snake

回答

1

做到這一點的最佳方法是響應超時。 因此發送請求(超時),然後等待響應超時。如果服務器在超時時間內沒有響應,則可以嘗試連接到下一臺服務器。像這樣:

if (client.TrySendFrame(TimeSpan.FromSeconds(2), jData) && 
    client.TryReceiveFrame(TimeSpan.FromSeconds(2), out jData)) 
{ 
    // Server is online 
} 
else 
{ 
    // Server is down 
} 
+0

太棒了!但是,當我檢查超時內的響應,如果沒有發送響應應用程序崩潰。如果檢查爲false,則執行跳至else語句,該語句應該向調用者返回一個false或其他任何其他消息。它看起來像線程卡住,並沒有回到調用者 – Snake

+0

我不知道我明白,在if語句中,你已經在jData中的響應。你會得到什麼例外? – somdoron

+0

我想,如果服務器停機,要停止並退出該功能,請繼續使用我的代碼。但在這種情況下(服務器關閉),如果我返回給調用者與其他{返回false;}應用程序卡住了。在一般的調試中,我注意到當離開使用語句而沒有收到服務器的響應時,應用程序被卡住了。我不是英語,所以希望很清楚 – Snake

相關問題