|
| 1 | + |
| 2 | +//I write not these things to shame you, but as my beloved sons I warn you. (1Cor 4:14) |
| 3 | + |
| 4 | +package com.javarush.task.task30.task3008; |
| 5 | + |
| 6 | +import java.io.*; |
| 7 | +import java.net.ServerSocket; |
| 8 | +import java.net.Socket; |
| 9 | + |
| 10 | +public class Server { |
| 11 | + public static void main(String[] args) { |
| 12 | + ConsoleHelper.writeMessage("Please, input server port: "); |
| 13 | + try (ServerSocket serverSocket = new ServerSocket(ConsoleHelper.readInt())) { |
| 14 | + ConsoleHelper.writeMessage("Server starting..."); |
| 15 | + while (true) { |
| 16 | + new Handler(serverSocket.accept()).start(); |
| 17 | + } |
| 18 | + } catch (Exception e) { |
| 19 | + ConsoleHelper.writeMessage("Error, server socket was closed."); |
| 20 | + } |
| 21 | + } |
| 22 | + |
| 23 | + private static class Handler extends Thread { |
| 24 | + private Socket socket; |
| 25 | + |
| 26 | + public Handler(Socket socket) { |
| 27 | + this.socket = socket; |
| 28 | + } |
| 29 | + } |
| 30 | +} |
| 31 | + |
| 32 | +/* |
| 33 | +Чат (6) |
| 34 | +Приступим к самому важному – написанию класса Server. Сервер должен поддерживать |
| 35 | +
|
| 36 | +множество соединений с разными клиентами одновременно. Это можно реализовать с |
| 37 | +
|
| 38 | +помощью следующего алгоритма: |
| 39 | +
|
| 40 | +- Сервер создает серверное сокетное соединение. |
| 41 | +
|
| 42 | +- В цикле ожидает, когда какой-то клиент подключится к сокету. |
| 43 | +
|
| 44 | +- Создает новый поток обработчик Handler, в котором будет происходить обмен |
| 45 | +
|
| 46 | +сообщениями с клиентом. |
| 47 | +
|
| 48 | +- Ожидает следующее соединение. |
| 49 | +
|
| 50 | +Добавь: |
| 51 | +
|
| 52 | +1) В класс Server приватный статический вложенный класс Handler, унаследованный от |
| 53 | +
|
| 54 | +Thread. |
| 55 | +
|
| 56 | +2) В класс Handler поле socket типа Socket. |
| 57 | +
|
| 58 | +3) В класс Handler конструктор, принимающий в качестве параметра Socket и |
| 59 | +
|
| 60 | +инициализирующий им соответствующее поле класса. |
| 61 | +
|
| 62 | +4) Метод main класса Server, должен: |
| 63 | +
|
| 64 | +а) Запрашивать порт сервера, используя ConsoleHelper. |
| 65 | +
|
| 66 | +б) Создавать серверный сокет java.net.ServerSocket, используя порт из предыдущего пункта. |
| 67 | +
|
| 68 | +в) Выводить сообщение, что сервер запущен. |
| 69 | +
|
| 70 | +г) В бесконечном цикле слушать и принимать входящие сокетные соединения только что созданного |
| 71 | +
|
| 72 | +серверного сокета. |
| 73 | +
|
| 74 | +д) Создавать и запускать новый поток Handler, передавая в конструктор сокет из предыдущего пункта. |
| 75 | +
|
| 76 | +е) После создания потока обработчика Handler переходить на новый шаг цикла. |
| 77 | +
|
| 78 | +ж) Предусмотреть закрытие серверного сокета в случае возникновения исключения. |
| 79 | +
|
| 80 | +з) Если исключение Exception все же произошло, поймать его и вывести сообщение |
| 81 | +
|
| 82 | +об ошибке. |
| 83 | +
|
| 84 | +
|
| 85 | +Требования: |
| 86 | +1. В классе Server должен быть создан приватный статический класс Handler, унаследованный от класса Thread. |
| 87 | +2. В классе Handler должно быть создано поле socket типа Socket. |
| 88 | +3. Конструктор класса Handler должен принимать один параметр типа Socket и инициализировать поле socket. |
| 89 | +4. Метод main должен считывать с клавиатуры порт сервера используя метод readInt класса ConsoleHelper. |
| 90 | +5. Метод main должен корректно реализовывать бесконечный цикл описанный в условии задачи. |
| 91 | +*/ |
0 commit comments