Итак, во-первых, это не совсем домашнее задание … но это вопрос из прошлой экзаменационной работы, и я готовлюсь к экзамену и не могу понять этого. (Игнорируйте любой импорт, которого нет здесь)
Также я знаю, что Double — очень плохое имя для класса, не только потому, что это встроенный тип, но и не очень наглядный, но я не думаю, что это принесет какие-либо оценки.
Кроме того, порт жестко запрограммирован, так как мы научились именно так, так что это не будет проблемой, поскольку нас еще не учили другому способу.
Я думаю, это основано исключительно на коде.
В вопросах говорится
The code of a simple server is shown below. It offers the trivial service of accepting an integer
value from a client and returning twice the value received.
Explain the weakness in the design
of the server and re-write it in light of your critique
После того, как я просмотрел код сам, я не вижу никаких проблем в исходном Server Class
насколько я понимаю пока все в порядке.
class DoubleServer{
private static int port = 1234; #2
public static void main(String args[]){
try{
ServerSocket serversock = new ServerSocket(port); #5
while(true){ #6
Socket socket = serversock.accept(); #7
new Thread(new Double(socket)).start(); #8
}
}catch(IOException e){}
}
}
У нас есть
- В
Port
создан (изначально я думал, что порт не должен быть частным, но это нормально) # 2 - В
ServerSocket
создается и передает порт # 5 - Цикл продолжения начинает заставлять сервер ждать запросов # 6
- Socket ожидает получения запроса # 7
- После отправки запроса он вызывает сервер Thread # 8.
Я не вижу здесь проблем
Затем у нас есть серверный поток
class Double implements Runnable{
Socket socket;
public Double(Socket s){socket = s;}
public void run(){
try{
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
int x = in.readInt();
out.write(2*x);
socket.close();
}
catch(IOException e){}
}
}
Вот где проблема
- Мы упаковали сокет, который прошел, и
Data in/out streams
- Мы читаем int от клиента
- Я думаю, что проблема в методе out заключается в том, что здесь выполняется вычисление квадрата числа, что я не думаю, что вы можете это сделать, или это плохая практика. Также я бы
flush()
после записи, чтобы гарантировать запись всех буферизованных байтов. - В
Socket
закрыт, и я бы также закрылData in/out streams
Если это неверно, и я что-то упустил, я был бы признателен за помощь или толчок в правильном направлении.