2010-08-27 134 views
2

我們希望實現一個服務器/客戶端應用程序供內部使用。有沒有人知道如何實現基於套接字的應用協議?如何實現應用程序協議

最好的問候!

+0

這個問題相當廣泛。有許多應用程序協議,包括HTTP,FTP,SSH等等。如果你可以更具體,我們可能會更有幫助。 – kbrimington 2010-08-27 04:25:25

回答

2

套接字中的協議幾乎可以作爲串行協議來實現。但一個很好的例子就是使用命令,你可以使用基於文本位置的佈局來實現它的更基本的形式,例如,

客戶寫道:

$ADD|Yongwei|Xing|25|M|# 

服務器響應和aknowledge如果一切正常(該數據是有效的),或者用代碼,如果沒有一個錯誤:

$ACK# 

或:

$ERR|2|# 

ADD是您的代碼必須讀取和評估的命令。也許你可以使用前三個字符作爲命令,參數分隔,就像這個例子一樣。

我建議您使用特殊字符而不是$和#分隔符。特殊字符的ASCII表的前30個字符,並且有適合工作的正確的字符:

dec char meaning: 
    2 STX  Start of text 
    3 ETX  End of text 
    4 EOT  End of trasmission 
    5 ENQ  Enquiry (asking for data, asking for a chance of transmission) 
    6 ACK  Acknowledge (confirmation of data received, allowing trasmission) 

應答位可作爲確認,如

,他打算通過發送詢盤的ASCII字符(我使用<和>來表示一個特殊字符)來傳輸一些數據

客戶端通知服務器:

<ETX> 

如果服務器已準備好讀數據,然後用確認的確認:

<ACK> 

則客戶端使用命令啓動發送數據:

<STX>ADD|jhon|deer|56|M|<ETX> 

以及服務器用<ACK> 確認它的每一個命令所以客戶端一直在發送數據,並且當數據被傳送時,然後發送一個<EOT>來通知服務器可以停止讀取數據(這樣一來,試圖讀取它作爲一個命令)。

0

這是一個相當開放的問題,但是如果你在套接字層面上操作,你可能是一個太深的層次,特別是如果你正在做應用程序開發。諸如用於網絡通信的庫boost::asio以及用於表示和編碼/解碼的庫將有所幫助。使用Google Web Toolkit (GWT)將簡化創建UI。您也可以考慮使用App Engine來託管後端代碼,因爲它會爲您提供比大多數DIY作業更高的可靠性和可擴展性。

0

對於內部使用,最簡單的解決方案是最好的解決方案。使用套接字(Windows上的winsock2,* BSD和Linux上的POSIX套接字),您應該在客戶端和服務器之間交換一些明文,例如FTP protocol,例如:

在FTP中,客戶端發送類似ASCII關鍵字的命令:QUIT ,LIST,STOR ...,參數用空格分隔。標記應該指示命令的結束。最簡單的標記是字符\n。然後,服務器向客戶端發送返回代碼以指示是否存在錯誤。返回碼只是一個數字,全部以純文本格式顯示。與返回代碼一起,有一條消息可以解釋錯誤,如果有的話。

FTP已在1985年的RFC中指定。它仍然正常工作,並且仍然被廣泛使用。 HTTP在客戶端發送由純文本中的幾行組成的HTTP標頭(由\n分隔)的意義上類似。

您應該關心的主要問題是您的解決方案的安全性。即使在內聯網上,例如,也必須使用安全機制來避免企業網絡上的數據泄漏。

最簡單的事情就是使用ssh(如OpenSSH)來加密你的網絡連接。它允許您控制誰可以調用服務器(身份驗證)並允許您加密數據。如果您的數據位於專用於您的應用程序的專用網絡上,則無需加密數據。