Я создал небольшое клиент-серверное приложение CLI. После загрузки сервера клиент может подключиться к нему и отправить команды на сервер.
Первая команда — получить список файлов, которыми загружен сервер.
Как только соединение сокета установлено. Я прошу пользователя ввести команду.
ClientApp.java
Socket client = new Socket(serverName, serverPort);
Console c = System.console();
if (c == null) {
System.err.println("No console!");
System.exit(1);
}
String command = c.readLine("Enter a command: ");
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF(command);
Затем сервер перехватывает команду пользователя и отправляет соответствующие ответы.
SeverApp.java —
Socket server = serverSocket.accept();
DataInputStream in = new DataInputStream(server.getInputStream());
switch (in.readUTF()){
case "list":
for (String fileName : files) {
out.writeUTF(fileName);
}
out.flush();
}
server.close();
Затем клиент получает ответ сервера -
ClientApp.java
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
String value;
while((value = in.readUTF()) != null) {
System.out.println(value);
}
client.close();
files
- это ArrayList, в котором я храню список файлов, загруженных на сервер. Когда клиент отправляет команду list
на сервер, мне нужно отправить массив строк (список имен файлов) обратно. Точно так же приложение будет иметь больше команд.
Теперь, когда я делаю такой запрос, я получаю список файлов и строк java.io.EOFException
из while((value = in.readUTF()) != null) {
.
Как это исправить?
РЕДАКТИРОВАТЬ (РЕШЕНИЕ) ---
http://docs.oracle.com/javase/tutorial/essential/io/datastreams.html
Обратите внимание, что DataStreams обнаруживает состояние конца файла, перехватывая исключение EOFException вместо проверки недопустимого возвращаемого значения. Все реализации методов DataInput используют EOFException вместо возвращаемых значений.
try {
while (true) {
System.out.println(in.readUTF());
}
} catch (EOFException e) {
}