2011-05-25 79 views
1

谷歌我的問題有點棘手,因爲它更多的是關於過程的問題,而不是嚴格的技術問題。通過TCP處理客戶端/服務器通信 - 一般問題

我正在建立一個基本的TCP客戶機/服務器系統,我想知道來回通信應如何理想地工作。在我的具體情況下,客戶端必須提交登錄憑證,並從服務器發出特定請求(服務器與遠程數據庫交互)。

下面是我想做的事..我只是從其他開發者的輸入來看。

SERVER: Wait for new connections 
CLIENT: Connects to server 
CLIENT: Once connected, send login credentials with an instruction code. 
     i.e. $LOGIN$,username,password 
SERVER: Check instruction code, if code = $LOGIN$, try to authenticate 
SERVER: If authentication fails, send user message saying login failed 
     i.e. $MSG$,101,Login Failed 
CLIENT: If instruction code = $MSG$ and if message id = 101, display message and disconnect. 

而另一種情況..讓我們說客戶想請求日誌發生了什麼事在服務器上最近(控制檯應用程序窗口的文本)。被請求

CLIENT: Send request message to server for recent log 
     i.e. $REQ$,105 
SERVER: If instruction = $REQ$ and request id = 105, get window text and send to client 
     i.e. $DATA$,105,<data here> 
CLIENT: If instruction = $DATA$ and data id = 105, parse data and display to user 

的數據可能是純文本,或者.NET數據錶轉換成XML等,這可能是很多方面的事情。

思考呢?提示?

謝謝!

+0

也許這個問題可能會被重寫爲更加「規範」的形式:「如何在.NET中使用TCP實現雙向通信?」 – hemp 2011-05-25 17:27:41

回答

2

我強烈建議通過安全(https)連接使用WCF Data Services。它非常適合以靈活高效的方式通過網絡公開數據集,並依靠經過驗證的ASP.NET身份驗證來確保安全性。

如果你仍然想基本的TCP/IP,考慮以下因素:

  • 你需要加密通信(SSL/TLS或類似的),因爲你已經通過認證的信息。
  • 消息的通用結構是「類型,長度,數據」(TLD)。這實現了一些向後兼容性,因爲接收器可以跳過它不識別的消息類型。
  • 請記住,TCP/IP不是一個消息協議,而是一個流協議,所以你需要message framing
  • 您還需要包含detecting half-open connections的條款。
  • 評估防止SQL注入攻擊所需的防護級別;一般來說,將SQL作爲文本接收的服務器是一個壞主意。

請注意,WCF數據服務(通過HTTPS使用時)將爲您處理上述所有內容。

+0

優秀的回覆,謝謝。我不知道WCF,但我一定會考慮它。 – arc 2011-05-25 18:28:08