2011-03-09 90 views
0

我正在學習如何使用插座與Java和所遇到的問題的腳本我希望寫。我已經爲客戶端和服務器編寫了一個基本腳本,現在希望對其進行擴展。 (這或多或少是這裏指定的:Link to Oracle tutorial)。TCP Java的質疑

現在我想調整這個程序讓它做一些不同的事情,我希望連接客戶端的服務器將主目錄中的所有文件列表發送到服務器,客戶端然後選擇一個,並將該文件的詳細信息發送回客戶端(相當於終端中的ls -a)。然後客戶端可以輸入yes或no,決定他們是否要下載文件。

我覺得應該很簡單,所以我想自己做,這樣我就可以學習,任何人都可以告訴我如何開始,或者我可以看一些例子,因爲我嘗試過搜索和什麼也找不到。

非常感謝。

編輯:我怎樣才能在一個目錄發送的文件列表,有一個函數來獲取這個名單?一旦建立了一套基本的請求/響應範例

+2

我們不打算爲您編寫代碼。開始攻擊它,並問我們是否有實現你想法的具體問題。 – 2011-03-09 20:47:50

+0

我指定我不希望任何人寫我的代碼,並要求我在哪裏可以看看示例和函數,以便我可以在哪裏學習如何自己完成這件事。如果你不會有所幫助的話,那麼你至少不會居高臨下。 – 2011-03-09 20:49:54

+2

歡迎來到StackOverflow,@FattyBolger!馬特是對的,你沒有問過一個具體的問題。這聽起來像你有一個你想要你的程序做什麼的想法,所以試試看。當你碰到一些你無法想象的東西時,回過頭來,發佈一些代碼,然後問一個可以客觀回答的問題。如果你正在尋找更多的開放式編程討論,那麼你可以看看[程序員.stackexchange.com](http://programmers.stackexchange.com)。 – 2011-03-09 20:56:21

回答

1

不應該是困難的。你基本上必須在服務器內部設置一個switch結構類型的構造,它將根據接收到的內容決定發送什麼。

喜歡的東西

if recievedCommand = Nothing 
    Send File List 
if recievedCommand = FileName 
    Send File info 
... 

等。 希望這會得到你的球滾動

+0

我明白了,所以在第一次連接客戶端時,我發送了一些不同的消息給服務器,它觸發它運行另一種方法向客戶端發送文件列表,然後從那裏我可以使用readLine將客戶端消息讀取到服務器。非常感謝你清除那個。你知道我會如何發送一個目錄中的所有文件嗎? – 2011-03-09 20:55:58

+0

File [] fileList = new File(dirName).listFiles() - 迭代並構建fileList [i] .getName()的字符串並將其作爲響應發送。 – 2011-03-09 21:00:01

+0

非常感謝。在這種情況下,是否可以爲主目錄提供dirName的默認值? – 2011-03-09 21:03:05

0

的協議是重要的在這裏。您可以設計一個文本協議,如示例中的KnockKnockProtocol。 e.g:

client: LIST 
server: FILES foo.txt bar.txt 
client: DETAILS bar.txt 
server: DETAILS bar.txt 123421 0644 myuser mygroup 
client: GET bar.txt 
server: FILEDATA bar.txt <base64-encoded content or such> 
client: QUIT 

但已經有很多的周圍,設計良好的協議是很難而且很容易編寫解析器等的錯誤這通常不值得。

但是...你使用Java客戶端和服務器和Java可以序列化對象,這樣就可以通過網絡流發送整個對象。這樣你就不必擔心解析問題。

通過ObjectInputStream剛纔看了網絡套接字,並通過ObjectOutputStream寫。這樣您就可以擁有對協議的請求和響應進行建模的類。

public interface Request implements Serializable { 
} 

public class ListFilesRequest implements Request { 
} 

public class FileDetailsRequest implements Request { 
    public String fileName; 
} 

public class DownloadFileRequest implements Request { 
    public String fileName; 
} 

public interface Response implements Serializable { 
} 

public class FileListResponse implements Response { 
    public String[] fileNames; 
} 

public class FileDetailsResponse implements Response { 
    public String fileName; 
    public int fileSize; 
    public int fileMode; 
} 

public class FileDataResponse implements Response { 
    public String fileName; 
    public byte[] fileData; 
} 

然後服務器可以這樣做:

ObjectInputStream objInput = new ObjectInputStream(mySocket.getInputStream()); 
ObjectOutputStream objOutput = new ObjectOutputStream(mySocket.getOutputStream()); 
Object requestObject = objInput.readObject(); 
Response responseObject = null; 

if (requestObject instanceOf ListFilesRequest) { 
    FileListResponse response = new FileListResponse(); 
    response.fileNames = new String[] { "foo.txt", "bar.txt" }; 
    responseObject = response; 
} 
else if (requestObject instanceOf FileDetailsRequest) { 
    FileDetailsRequest request = (FileDetailsRequest)requestObject; 
    String fileName = request.fileName; 
    ... 
} 

objOutput.writeObject(responseObject); 

...或者是這樣的。