2012-12-21 89 views
-1

我已經搜索瞭如何使用套接字在linux中接收和發送文件的整潔解釋,但我找不到解決方案,甚至工作一點點。 我有一個Linux上的c + +服務器,並在java中運行的客戶端。發送文件從Java套接字到C + + Linux的插座

我需要做以下幾點:

  • 客戶需要能夠朝着服務器發送文本的命令。
  • 客戶端需要能夠向服務器發送/接收文件。接收文件時
  • 服務器獲取以下命令:PUT < saveLocation> < filecontents>
  • 一切得到由 「\ n」 個關閉。

我已經寫了很多代碼,並且能夠在客戶端和服務器之間來回發送命令。但現在我堅持在客戶端和服務器上發送/接收文件。

我應該採取哪些步驟,以便能夠從客戶端收到一條命令,其中提示「PUT /map1/test.pdf somefile」 並且還會收到實際的文件?

如果代碼需要請問,我會發布它,但我不知道哪些代碼塊可以幫助。

+0

關鍵是,如果它是一個大文件,將文件分段發送。使用緩衝區以較小的部分讀取/寫入文件。如果這不是你想要的,你需要在你的問題中更具體。 –

+0

C++或java在這裏不相關。問題是:你在雙方都有一個套接字,並且你以兩種方式發送數據。你必須設計一個協議,允許你做你想做的事情(就像FTP是一個實現你所需要的協議一樣)。然後你在雙方都實現它,你就完成了。您可以查找示例協議並從中進行構建。 – Mic

+0

如果「所有東西都被\ n」。「關閉了,您有兩個很大的限制。您無法發送二進制文件,也無法使用多行發送文本。我會重新考慮這個協議。 –

回答

0

一個套接字只傳輸信息的字節 - 它不知道這些字節是來自文件,消息還是隨機生成的。發送和接收軟件完全由組織字節組成,以便接收器可以解釋發送的字節。

通常對於簡單的消息,發件人只是用ASCII(或某種編碼)行尾結束每個消息。但是,對於可能包含行尾字節作爲有效數據的數據而言,這並不合適。

對我而言,最簡單的事情是發送每條消息中發送的字節數。除非有外部原因,否則我不會嘗試在一個消息中發送整個文件;我會把文件分解成「塊」。我將定義一條消息,將特定塊中的字節數作爲第一個字節,然後發送其餘的塊,然後重複,直到發送完所有塊。

接收者顯然必須知道字節數是第一個發送的數據,它有多少字節,哪個字節(高或低的順序)是第一個,等等。接收機然後有足夠的信息讀取所有塊並將它們放回到一起。我也會包括一個「握手」,即接收者在每個塊之後都會返回一個消息,指示它接收到了這個消息;否則,您可能會花費大量時間發送字節,以便發現您的接收器由於某種原因而關閉。

+0

你爲什麼要實現TCP/IP協議棧本身的東西? IP協議會將您的數據分解爲數據包,TCP協議將握手並確認傳輸。 – pap

+0

你有一個關於分手的觀點;有些情況下我不會爲此而煩惱。至於握手:傳輸協議的確會確保數據包被傳輸並恢復到原來的順序,但是如果不是的話,它不一定會給應用程序帶來有意義的錯誤。發送應用程序需要知道整個郵件的接收是否正確,並且我認爲最好通過從接收方向發送方發回確認來完成。 – arcy

1

爲什麼不使用FTP服務器呢?畢竟,FTP設計就是爲了做到這一點。您可以在您的服務器上設置FTP守護程序,並使用Apache commons-net的FTPClient。

如果你想重新發明輪子,MIME多部分方法(用於通過HTTP發佈文件或在電子郵件中發送附件時使用)是定義邊界,然後BASE64編碼二進制文件內容能夠將它作爲ASCII文本發送。

邊界應該是一個足夠複雜的字符串,以便是唯一的。然後,您的「交易」看起來像

PUT <filename> boundary=A_COMPLEX_BOUNDARY_STRING<newline> 
<BASE64 encoded binary file content>A_COMPLEX_BOUNDARY_STRING 

當服務器上接收,解析文件名,邊界值,然後你知道第一個換行符的邊界線後一切都是編碼的二進制文件的BASE64數據。