2012-03-01 50 views
4

我有以下情況:
客戶端 - >路由器 - >互聯網 - >專用服務器

客戶:啓動時,連接到服務器,並保持連接打開。偶爾會從服務器接收文件更改的通知。開始一個同步過程,然後通知服務器這是否成功。有時可能會失去聯繫,因此必須建立新的聯繫。

服務器(互聯網):包含有時會更改的文件。接受傳入的客戶端,並保留該客戶端的tcpclient對象。它不能直接與客戶端連接,因爲客戶端位於幾臺路由器後面;這就是連接必須保持開放的原因。通知客戶更改時間。並且還爲每個客戶端檢查同步成功消息。使用讀/寫相同的TcpClient,並保持它活着

問題:

  1. 如何有效地保持我的連接上的客戶端和服務器端的開放?

  2. 當客戶想通知 同步過程是成功的,但在此期間,服務器 通知客戶端有新的更新。該服務器會發生什麼?

  3. 在整個程序中創建一個Tcpclient(客戶端)並保持此對象是否是一種很好的做法?當某些網絡操作失敗時,請嘗試再次連接這個tcpclient對象?

我做了很多的研究,但不能真正找到的東西,保持使用相同的TcpClient ..

順便說一句:這是根據我以前的帖子一個新的線程,是該解決方案(重用的TcpClient )提出了(提前udp packet not coming through

招呼大安&感謝您的關注

回答

6

如何有效地保持我的連接的客戶端和服務器上打開一面呢?

TCP 發送可以發送保持活動消息每默認如果激活SO_KEEPALIVE。但它可以發送自己的保活消息是一個好主意(以防止路由器等空閒連接斷開)

當客戶想以通知同步過程是成功的服務器會發生什麼,但在同時服務器通知客戶端進行新的更新..?

設計您的協議,使其具有請求ID,並且可以在通知和回覆之間有所不同。

將您的API設計爲同步,但使用異步套接字處理。

在整個程序中創建一個Tcpclient(客戶端)並保持這個對象是一個好習慣嗎?當某些網絡操作失敗時,請嘗試再次連接這個tcpclient對象?

您確定可以再次連接到同一個客戶端嗎? IIRC它不可能與SocketTcpClient相同

我會使用相同的客戶端,只要它沒有斷開連接。

+0

如果您引用SO_KEEPALIVE套接字選項,則默認情況下它未啓用。如果啓用,默認超時通常按照每兩小時一次保持活動消息的順序。 TCP沒有其他保活機制。 – 2012-03-01 11:58:33

+0

@JoachimPileborg:謝謝。我以爲它默認是開啓的。 – jgauffin 2012-03-01 12:01:25

+0

那麼......你怎麼激活那個套接字選項? – Nyerguds 2013-06-25 10:30:21

3
  1. 要確保連接保持打開狀態,並且客戶端和服務器之間沒有網絡故障,您可以向協議添加兩條消息:保持活動狀態並保持活動答覆。無論是客戶端還是服務器(由您決定)都會定期發送保持活動消息(每分鐘一次),另一端則回覆保持活動狀態。如果發送保持活動消息的發送者在發送下一個保持活動消息時沒有收到回覆,則可以認爲該連接失效並關閉連接。另一端,發送回覆的人需要一個計時器。如果在指定的時間內未收到保活請求,則應關閉連接。
  2. 客戶端只是讓來自服務器的通知排隊,並在可能時處理它們。要麼增加客戶端中的接收緩衝區(setsockoptSO_RCVBUF),要麼保留自己的隊列。要跟蹤哪個「同步完成」消息符合哪個「同步」消息,您必須在消息中添加某種消息標識符。這可以是一個簡單的整數值,它會開始一個零,然後服務器爲每個「do-sync」消息增加一個值。
  3. 只要你有一個工作連接,保持連接對象。當重新連接的時候,我會創建一個新的連接對象,以保證安全。但它可能會重用舊的,我不太瞭解C#和.NET庫。
0

Heyup Daan。此問題已在最近的networkComms.net提交中得到解決。如果檢測到沒有其他流量正在發送,它會每隔幾秒發送一個字節來使連接保持活動狀態。如果您看一下這個開源的C#網絡通信庫,從11行示例here開始,您可能會比從頭開始創建所有內容更快一些。