的協議是重要的在這裏。您可以設計一個文本協議,如示例中的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);
...或者是這樣的。
來源
2011-03-09 21:25:32
jkj
我們不打算爲您編寫代碼。開始攻擊它,並問我們是否有實現你想法的具體問題。 – 2011-03-09 20:47:50
我指定我不希望任何人寫我的代碼,並要求我在哪裏可以看看示例和函數,以便我可以在哪裏學習如何自己完成這件事。如果你不會有所幫助的話,那麼你至少不會居高臨下。 – 2011-03-09 20:49:54
歡迎來到StackOverflow,@FattyBolger!馬特是對的,你沒有問過一個具體的問題。這聽起來像你有一個你想要你的程序做什麼的想法,所以試試看。當你碰到一些你無法想象的東西時,回過頭來,發佈一些代碼,然後問一個可以客觀回答的問題。如果你正在尋找更多的開放式編程討論,那麼你可以看看[程序員.stackexchange.com](http://programmers.stackexchange.com)。 – 2011-03-09 20:56:21