Это требует, чтобы вы хорошо разбирались в Java, ServerSocket, clientSocket.
У меня была мотивация создать его, когда я не мог понять, как современные серверы приложений масштабируются до миллионов подключений с помощью одного экземпляра. Так что я начал работать над этим. Я не мог получить большой помощи из Интернета, когда начал строить, поэтому написал эту документацию…
Прыгаю прямо на код.
Это основной класс, в котором начнет работать Параллельный сервер.
class ConcurrentServer{ public static void main(String[] arg) throws IOException, InterruptedException { int port; if(arg.length == 0){ port = 8080; } else{ port = Integer.parseInt(arg[0]); } new ConcurrentServer().start(port); } }
Подожди секунду…. Запомните это Список клиентов
здесь. Это играет важную роль.
public class Shared { public static Listclients = new ArrayList<>(); public static int count= 0; private Shared(){ } }
Когда новый пользователь подключается к серверу, объект подключения помещается в список клиентов в Shared
class (см. Ниже).
Приведенный ниже класс User
простирается от clientSocket
.
public ConcurrentServer{ public static void main..... . . . . public void start(int port) throws IOException, InterruptedException{ try(ServerSocket server = new ServerSocket(port)){ Thread channelReaderThread = new Thread(channelReader); channelReaderThread.start(); while(ALWAYS_RUNNING){ User client = new User(server.accept()); Shared.clients.add(client); } } } }
Далее мы читаем сообщения пользователей, которые могут появиться в любой момент.
private void process() { int maxSize = Shared.clients.size(); for(int i = 0 ; i < maxSize ; i++) { User user = Shared.clients.get(i); queryClient(user, i); } } private void queryClient(User user,int index) { InputStream inputStream = user.getInputStream(); if( inputStream.available() <= 0 ) { return; } ConnectedBy connection = user.getConnectionType(); connection.handle(user); }
Помните этого парня Shared.clients
, это массив, куда помещаются подключенные пользователи в основном потоке.
Приведенный выше метод process
запускается каждые 100 мс. Java предоставляет метод с именем InputStream.available(), если пользователь отправляет какое-либо сообщение, InputStream.available()
будет > 0. Это время, мы можем прочитать сообщение из входного потока.
Как только вы сможете прочитать сообщение и поскольку у вас уже есть все клиентские подключения в Shared.clients
вы можете повторить его и отправить входящее сообщение всем клиентам в нем.
Следовательно, у вас есть функционирующее приложение для обмена сообщениями.
Он протестирован с несколькими тысячами параллельных подключений, большую часть времени он доставляет сообщения. Но Осторожно. Бывают случаи, когда сообщения отбрасываются, я пока не мог понять, почему эти сообщения отбрасываются. Так что любая помощь будет высоко оценена.
Любой, кто понимает или не понял это, прокомментируйте, мне было бы очень интересно связаться с вами.
исходный код. исходный код.
Оригинал: “https://dev.to/justhere/building-a-messaging-server-from-scratch-java-30of”