Протокол важен здесь. Либо вы можете создать текстовый протокол, например, KnockKnockProtocol в примере. например:
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);
... или что-то в этом роде.