Conversation
| System.out.print(b); | ||
| } | ||
| System.out.println(); | ||
| } |
There was a problem hiding this comment.
а если аргументы неверные? тихонько выйдем и ничего не скажем?)
| System.out.println(bytes.length); | ||
| for (byte b: bytes) { | ||
| System.out.print(b); | ||
| } |
There was a problem hiding this comment.
- файл может не влезть в память -1
- бинарные файлы тоже в консоль будут выводиться? может все-таки сохранить?
| DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); | ||
| DataInputStream dis = new DataInputStream(socket.getInputStream()); | ||
| dos.writeInt(code); | ||
| method.writeValue(dos, value); |
There was a problem hiding this comment.
странно, почему разные сущности что-то пишут в dos? почему value дается снаружи, а пишет его method? может лучше method все запишет и все прочитает?
There was a problem hiding this comment.
method - удаленная процедура. Она знает как сериализовывать/десериализовывать объекты.
Это разумно. С другой стороны она не знает какой у нее идентификатор на конкретном сервере, что тоже, вроде, разумно.
| DataInputStream dis = new DataInputStream(socket.getInputStream()); | ||
| dos.writeInt(code); | ||
| method.writeValue(dos, value); | ||
| return method.readResult(dis); |
| return getValue(new Socket(host, port), 2, new GetMethod(), name); | ||
| } | ||
|
|
||
| public static <Value, Result> Result getValue(Socket socket, int code, Method<Value, Result> method, Value value) |
There was a problem hiding this comment.
используется только внутри класса и тестах, это значит, что:
должен стать приватным
тесты должны быть написаны без него
There was a problem hiding this comment.
Изначальная задумка была в том, чтобы разнести межсетевое взаимодействие и работу с данными, и тестировать их раздельно. Этот метод способствует задумки. Я перенес его в интерфейс Method.
| void writeResult(DataOutputStream dos, Result result) throws IOException; | ||
|
|
||
| Result readResult(DataInputStream dis) throws IOException; | ||
| } |
There was a problem hiding this comment.
еще и названия сбивают с толку, как понять, что делает apply? может лучше его сигнатуру заменить на Result execute(Request request)?
то же и с write/readvalue
| dos.write(bytes, 0, bytes.length); | ||
| for (Byte aByte : bytes) { | ||
| dos.writeByte(aByte); | ||
| } |
|
|
||
| @Override | ||
| public byte[] readResult(DataInputStream dis) throws IOException { | ||
| int length = dis.readInt(); |
| int length = dis.readInt(); | ||
| byte[] bytes = new byte[length]; | ||
| int read = dis.read(bytes, 0, length); | ||
| if (read != length) throw new IOException("Bad read,"); |
There was a problem hiding this comment.
??? вполне естественная ситуация, надо ее поддерживать -1. см readFully у dis
|
|
||
| @Override | ||
| public String toString() { | ||
| return name; |
There was a problem hiding this comment.
а как пользователю увидеть папка это или файл? -0.25
|
Я слегка просчитался. Идея класса Method была в том, чтобы передавать небольшие объекты. |
|
Я на всякий случай напишу, что готово к проверке. |
| import java.net.Socket; | ||
| import java.util.List; | ||
|
|
||
| @SuppressWarnings("all") |
There was a problem hiding this comment.
лучше подавлять конкретные варнинги и как можно ближе к месту подавления, иначе какой-н. важный варнинг в будущем будет подавлен
| try (Socket socket = new Socket(host, port)) { | ||
| DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); | ||
| dos.writeInt(2); | ||
| dos.writeUTF(name); |
| import java.io.IOException; | ||
| import java.net.Socket; | ||
|
|
||
| public interface Method<Request, Response> { |
| dos.writeInt(code); | ||
| method.writeRequest(dos, request); | ||
| Response response = method.readResult(dis); | ||
| socket.close(); |
|
|
||
| private final static int code = 0; | ||
| private final static AtomicBoolean trigger = new AtomicBoolean(false); | ||
| public static final Method<String, String> method = new Method<String, String>() { |
| Server server = new Server(InetAddress.getByName("localhost"), 8080); | ||
| server.start(handlers); | ||
| Thread.sleep(500); | ||
| Client client = new Client("localhost", 8080); |
@sproshev