Рубрики
Без рубрики

Создание сервера обмена сообщениями с нуля. (Java)

Это требует, чтобы вы хорошо разбирались в Java, ServerSocket, clientSocket. Я был мотивирован на б… С тегами show dev, java, discussion, tutorial.

Это требует, чтобы вы хорошо разбирались в 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 List clients = 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”