TCP Java вопрос - PullRequest
       5

TCP Java вопрос

0 голосов
/ 09 марта 2011

Я изучаю использование сокетов с Java и столкнулся с проблемой для сценария, который я хочу написать. Я написал базовый скрипт для клиента и сервера и теперь хочу его расширить. (Это более или менее указано здесь: Ссылка на учебник Oracle ).

Теперь я хочу адаптировать эту программу, чтобы она делала несколько разные вещи, я хотел бы, чтобы сервер при подключении клиента отправлял на сервер список всех файлов в домашнем каталоге, затем клиент выбирает один и детали этого файла отправляются обратно клиенту (эквивалент ls -a в терминале). Затем клиент может напечатать «да» или «нет», решив, хотят ли они загрузить файл.

Я думаю, что это должно быть достаточно просто, поэтому я хотел бы сделать это сам, чтобы я мог узнать, может ли кто-нибудь сказать мне, как я могу начать, или некоторые примеры, на которые я могу смотреть, потому что я пытался искать и могу ничего не найти.

Большое спасибо.

Редактировать: Как я могу отправить список файлов в каталоге, есть ли функция, чтобы получить этот список?

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Не должно быть затруднено, если вы настроили базовый пример запроса / ответа. По сути, вам придется настроить внутри сервера тип коммутации, который будет решать, что отправлять, основываясь на том, что он получает.

Что-то вроде

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

И так далее. Надеюсь, что это заставит ваш мяч катиться

0 голосов
/ 10 марта 2011

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

... или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...