LINUX.ORG.RU
ФорумTalks

Отстал от жизни: какие открытые протоколы для создания мессенджеров нынче рулят и педалят вместо XMPP?

 ,


0

3

Условно говоря, какой открытый протокол общепризнанно считается современным наместником XMPP и какое семейство клиентов для данного протокола занимает топовые чарты мировых хит-парадов? Matrix? Всё ещё XMPP? Что-то ещё? Безотносительно архитектуры сети передачи сообщений - федеративная, авторитарная, децентрализованная и т.п. В приоритете базово интересует «один корпоративный сервер и 500 клиентов с прописанным адресом сервера» и никакой федерации. Мессенджер для меня и моей бабушки без покидания этого контура. Или для меня и сотрудников моего завода, которых 300.

Фичи, которые интересуют в клиенте/протоколе:

  1. Твой контактлист (базовая база), засылаемый с сервера.
  2. В контактлисте сущности вида «чат», «канал».
  3. Возможность аттачить файлы размеров и типов, о которых сообщил сервер как о допустимых. Возможность аттачить голосовухи и предположительно «кружочки». Допустим, сервер на чате ставит настройки «сюда можно картинки до 180 кб каждую» или ещё «частота отправки месаг в данный чат - раз в 30 сек».
  4. Шифрование там всякое жесточайшее конечно. E2E не обязательно, ну исключение MITM хотя-бы просто.
  5. Сам протокол предпочтительно более бинарный и суперкомпактный, чтобы в глухом подвале на GPRS законнектилось, а не развесистая XML-фигня на 2 мегабайта на простейший пинг.
  6. Всякое там админство. Удаление сообщений в администрируемых тобой чатах, навешивание лимитов и прав. Типа запрет аттачей в каком-то чатике.

Посибо.



Последнее исправление: tcpfinhello (всего исправлений: 6)

Что значит «вместо XMPP»? XMPP никуда не исчезал.

firkax ★★★★★
()

всё также xmpp

1 есть

2 есть

3 есть http upload, остальное от клиента зависит

4 есть

5 есть бинарные формы xml и сжатие

6 хз, наверное надо выбирать

sergej ★★★★★
()

Интересует возможность работать с одним жёстко прибытым в настройках гвоздями сервером, реализующим данный протокол, который поднят на моей виртуалке. Мессенджер для меня и моей бабушки без покидания этого контура.

Мне ИИ чадбот после длительного допроса с похожими вводными убедил, что проще XMPP для этих целей так ничего и не придумали. Пишет, что matrix гигабайты рамы требует, и гемор с настройкой. А всё остальное ещё хуже.

yvv1 ★★
()
Ответ на: комментарий от yvv1

ИИ мне выдало обратное: XMPP монструозен по сети и устарел, а Matrix гоняет меньше трафика. Что там требует гигабайт - наверное определённые конкретные реализации клиентов Matrix руками тупой школоты через одно место на браузерных движках, вместо нативных технологий.

Хм, какая-то жесть. Если явно спросить о разнице между XMPP и Matrix, то всё получается наоборот. XMPP легковесный во всём, Matrix много жрёт. Что-то там в Android и iOS ещё специфическое вылезает такое, что в итоге XMPP сожрёт меньше батарейки.

Минусы XMPP только в особой осторожности в плане синхронизации сообщений между разными устройствами одного клиента (этого тупо «по дефолту» нет, надо что-то там дореализовывать, какое-то «расширение») и в передаче файлов - тоже какая-то там полу-стандартная фича через «расширение» протокола некое. Короче такие дела.

Поспрашивал ещё у другой нейроночки - картина стала более сложная. В общем ну его нафиг, надо исследовать детальнее.

tcpfinhello
() автор топика
Последнее исправление: tcpfinhello (всего исправлений: 3)
Ответ на: комментарий от LightDiver

Не издевайся над бабушкой. Мы то молодые, привычные. Юзай нормальный мессенджер.

Предполагается, что они внешне все одинаковые. Бабушкам вообще вся эта опердень стресс, любая. В телеге вон недавно вообще интерфейс поменяли, я думаю по стране от этого 150 пенсионеров инфаркт поймало.

Предполагается, что опенсурсный клиент может выглядеть минималистично и понятно любому дебилоиду. Один раз внучек настроит - сервер пропишет в настройках.

tcpfinhello
() автор топика
Последнее исправление: tcpfinhello (всего исправлений: 2)
Ответ на: комментарий от tcpfinhello

А, ещё один офигенный совет от чадбота: навайбкодить свой мессенджер на вэбсокетах. Это может быть даже прикольно. Может на пенсии займусь.

yvv1 ★★
()
Ответ на: комментарий от yvv1

А, ещё один офигенный совет от чадбота: навайбкодить свой мессенджер на вэбсокетах. Это может быть даже прикольно. Может на пенсии займусь.

Это уже сделано кстати. Но пока только браузерная версия. Вот хочется наш сервер допилить каким-то протоколом (либо XMPP, либо Matrix), чтобы под этот протокол найти на помойке достаточный выбор opensource-клиентов для максимума платформ. Но чтобы это не работало тормознее телеграма условного, а то я знаю как в Matrix молодёжные модные хипстеры везде пихают современные UI-фреймворки с кучей анимаций каждого пука, в итоге жесть. Может я конечно щас фигню сказал после знакомства с неудачным экземпляром.

tcpfinhello
() автор топика
Последнее исправление: tcpfinhello (всего исправлений: 2)
Ответ на: комментарий от tcpfinhello

Это уже сделано кстати. Но пока только браузерная версия. Вот хочется наш сервер допилить каким-то протоколом (либо XMPP, либо Matrix), чтобы под этот протокол найти на помойке достаточный выбор opensource-клиентов для максимума платформ.

А нахер этот протокол нужен, по большому счёту, если можно просто и без выкрутасов, если уже есть вэб клиент?

yvv1 ★★
()
Ответ на: комментарий от ofp

Не знаю, я вот настолько отстал от жизни. :)

dataman ★★★★★
()
Ответ на: комментарий от tcpfinhello

XMPP легковесный во всём, Matrix много жрёт

Так и есть. Начиная от сервера и заканчивая клиентами.
Сервер джаббера может на 60 метрах оперативы работать, если мне память не изменяет. Мактрица же отожрёт пару гигов, плюс ещё в силу упоротого протокола будет нещадно тупить и лагать, а если ты захочешь поиск по истории, то вообще ух…
Плюс клиенты: у матрицы это обычно электроно-поделия с соответствующим количество потребления ресурсов.

Zhbert ★★★★★
()
Ответ на: комментарий от ofp

Это прям можно купить icq.org.ru и поднять свой сервак?

Да.

Zhbert ★★★★★
()
Ответ на: комментарий от yvv1

Прототип можно за вечер собрать. А можно взять готовый с github, их там сотни.

Leupold_cat ★★★★★
()
Ответ на: комментарий от yvv1

Я, не написав тогда еще ни одной строчки кода на js, посоветовался с чат-ботом, поизучал технологии и за 2 недели рабочий навайбкодил. Правда за это время пришлось понять как работает что и в итоге разобраться и в js и в ts и вообще в целом. Но рабочая версия за 2 недели была.

А на раст рабочая версия была за сутки. Сервер+консольный клиент. Но связь голосовая была.

LightDiver ★★★★★
()
Ответ на: комментарий от Zhbert

Мой самописный на ts(node.js) работает на 37 метрах на 25 рыл рейда.

LightDiver ★★★★★
()
Ответ на: комментарий от yvv1

А нахер этот протокол нужен, по большому счёту, если можно просто и без выкрутасов, если уже есть вэб клиент?

Тупо тем, что никто не готов почесаться встать с дивана и разработать с нуля свой Android-клиент. А в мире Matrix-клиентов или XMPP-клиентов уже есть выбор, можно взять и заюзать!

tcpfinhello
() автор топика
Ответ на: комментарий от Zhbert

У matrix есть альтернатиный сервер на go - dendrite, который не очень тяжёлый.

И клиенты тоже совсем разные есть: чисто qt-шный, kde-шный, gtk-шный, на flutter. Их вообще много, хоть и не все доделанные.

У jabber знаю клиенты только gajim, deno и kde-шный несовместимый.

Если говорить про глючность, то у меня и то и то иногда криво работает. В matrix бывает что-то странное с передачей и подтверждением ключа, в jabber регулярно теряются сообщения.

A12345
()
Ответ на: комментарий от LightDiver

Если есть браузерная версия, чего тебе надо от клиента еще? Оберни в электрон - вот тебе клиент.

Я где-то слышал, что это будет жесть какая тормозная задница и меня проклянут. Нельзя просто так взять и… надо нативное делать, как Повел Дурев делает телеграм - быстро, чотко, по-пацански чтобы работало.

tcpfinhello
() автор топика
Ответ на: комментарий от tcpfinhello
package com.example.nsvca

import android.Manifest
import android.content.pm.PackageManager
import android.media.AudioManager
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.PowerManager
import android.view.WindowManager
import android.webkit.*
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.activity.result.contract.ActivityResultContracts

class MainActivity : AppCompatActivity() {

    private lateinit var webView: WebView
    private var filePathCallback: ValueCallback<Array<Uri>>? = null
    private val WEB_URL = "https://ns.fiber-gate.ru"
    private var wakeLock: PowerManager.WakeLock? = null

    private val permissionLauncher = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        val allGranted = permissions.entries.all { it.value }
        if (!allGranted) {
            Toast.makeText(this, "Для работы чата необходимы разрешения", Toast.LENGTH_LONG).show()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportActionBar?.hide()

        webView = WebView(this)
        setContentView(webView)

        checkPermissions()
        setupWebView()
        loadUrl()

        // 🔥 Аудио-настройки для WebRTC
        val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
        audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
        audioManager.isSpeakerphoneOn = true
        audioManager.requestAudioFocus(
            { focusChange -> },
            AudioManager.STREAM_VOICE_CALL,
            AudioManager.AUDIOFOCUS_GAIN
        )

        // 🔥 WakeLock для работы при заблокированном экране
        try {
            val powerManager = getSystemService(POWER_SERVICE) as PowerManager
            wakeLock = powerManager.newWakeLock(
                PowerManager.PARTIAL_WAKE_LOCK,
                "NSVCa::VoiceChatLock"
            )
            wakeLock?.acquire(10*60*1000L) // 10 минут
        } catch (e: Exception) {
            // Игнорируем ошибку
        }
    }

    private fun checkPermissions() {
        val permissions = mutableListOf(
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.CAMERA,
            Manifest.permission.MODIFY_AUDIO_SETTINGS
        )

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            permissions.add(Manifest.permission.READ_MEDIA_IMAGES)
        } else {
            permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE)
        }

        val neededPermissions = permissions.filter {
            ContextCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
        }.toTypedArray()

        if (neededPermissions.isNotEmpty()) {
            permissionLauncher.launch(neededPermissions)
        }
    }

    private fun setupWebView() {
        val settings = webView.settings
        settings.javaScriptEnabled = true
        settings.domStorageEnabled = true
        settings.mediaPlaybackRequiresUserGesture = false
        settings.allowFileAccess = true
        settings.allowContentAccess = true
        settings.setSupportZoom(false)
        settings.userAgentString = settings.userAgentString + " NSVCa/1.0"

        // 🔥 Включаем фокус
        webView.isFocusable = true
        webView.isFocusableInTouchMode = true

        webView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
                return false
            }
        }

        webView.webChromeClient = object : WebChromeClient() {
            override fun onPermissionRequest(request: PermissionRequest) {
                runOnUiThread {
                    // 🔥 Разрешаем ВСЕ ресурсы (аудио + видео)
                    request.grant(request.resources)
                }
            }

            override fun onShowFileChooser(
                webView: WebView,
                filePathCallback: ValueCallback<Array<Uri>>,
                fileChooserParams: FileChooserParams
            ): Boolean {
                if (this@MainActivity.filePathCallback != null) {
                    this@MainActivity.filePathCallback?.onReceiveValue(null)
                }
                this@MainActivity.filePathCallback = filePathCallback

                val intent = fileChooserParams.createIntent()
                try {
                    fileLauncher.launch(intent)
                } catch (e: Exception) {
                    this@MainActivity.filePathCallback = null
                    Toast.makeText(this@MainActivity, "Не удалось открыть выбор файлов", Toast.LENGTH_SHORT).show()
                    return false
                }
                return true
            }
        }
    }

    private val fileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        val resultIntent = result.data
        if (filePathCallback != null) {
            val results = if (result.resultCode == RESULT_OK && resultIntent != null) {
                val dataString = resultIntent.dataString
                val clipData = resultIntent.clipData

                if (dataString != null) {
                    arrayOf(Uri.parse(dataString))
                } else if (clipData != null) {
                    val uriList = mutableListOf<Uri>()
                    for (i in 0 until clipData.itemCount) {
                        uriList.add(clipData.getItemAt(i).uri)
                    }
                    uriList.toTypedArray()
                } else {
                    null
                }
            } else {
                null
            }
            filePathCallback?.onReceiveValue(results)
            filePathCallback = null
        }
    }

    private fun loadUrl() {
        webView.loadUrl(WEB_URL)
    }

    override fun onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack()
        } else {
            super.onBackPressed()
        }
    }

    override fun onStop() {
        super.onStop()
        releaseWakeLock()
    }

    override fun onDestroy() {
        super.onDestroy()
        releaseWakeLock()
        webView.destroy()
    }

    private fun releaseWakeLock() {
        try {
            wakeLock?.let {
                if (it.isHeld) {
                    it.release()
                }
            }
        } catch (e: Exception) {
            // Игнорируем ошибку
        }
        wakeLock = null
    }
}

Не за что.

LightDiver ★★★★★
()
Ответ на: комментарий от Zhbert

Сервер джаббера может на 60 метрах оперативы работать, если мне память не изменяет. Мактрица же отожрёт пару гигов, плюс ещё в силу упоротого протокола будет нещадно тупить и лагать, а если ты захочешь поиск по истории, то вообще ух… Плюс клиенты: у матрицы это обычно электроно-поделия с соответствующим количество потребления ресурсов.

Это всё какая-то не подтверждённая (хотя-бы логически) информация. Начиная с того, что Matrix использует JSON, что даже тупо в нераспарсенном виде компактнее XML. Почему надо обязательно жрать 2 гига на поддержку соединений до 50 клиентов не очень ясно. Что спецификация Matrix требует такого? На каждое соединение какой-то конечный автомат из 300 миллионов состояний или что там на 2 гига-то. Если какой-то школьник реализовал сервер из нутеллы и соломы и поел много памяти, мы не можем сделать вывод, что так будут реализованы все сервера. Вот, скажем, есть у меня сервер мессенджера самодельный на C++. Он сейчас общается по WebSocket с браузерами. Я начинаю прикручивать к этому серверу протокол Matrix. В каком технически-логически-алгоритмически месте я начинаю резко хотеть жрать 2 гига я не понял.

tcpfinhello
() автор топика
Ответ на: комментарий от tcpfinhello

Никакой нагрузки. Запуск секунда. Нулевая нагрузка на процессор. ОЗУ жрет дохрена, но кто ее сейчас считает.

LightDiver ★★★★★
()
Ответ на: комментарий от tcpfinhello

Вот как раз так делать не надо. У него редкостное говно вышло в пален войс-сервера. Когда закрыли дискорд, мы гильдией юзали войса в телеге. Это было ужасно - во всем. Потому что плсюы для такого не подходят. На них не нормального маршрутизатора. Они есть на js, есть на расте частично. Другие языки уже не смотрел особо.

Телега прекрасна как чат. Как звонилка приватная между двумя абонентами сносно. Как войс чат - говно. Как файообменник даже лучше скайпа, да.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 3)
Ответ на: комментарий от ofp

.ru купить можно, но поднять icq на нём без лицензий нельзя.

Shadow ★★★★★
()
Ответ на: комментарий от tcpfinhello

Там не все так просто. Ты нормальный sfu cервер задолбаешься писать и все синхронизировать. Такое пилится годами профессионалами. А вот готовых опенсорсных есть.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Там не все так просто. Ты нормальный sfu cервер задолбаешься писать и все синхронизировать. Такое пилится годами профессионалами. А вот готовых опенсорсных есть.

Я не понял что мне делать с этой информацией, почему ты не пошёл и не проконсультировал команду телеги как им разрабатывать голосовые чаты. И вопроса о голосовых чатах не стояло в треде.

tcpfinhello
() автор топика
Последнее исправление: tcpfinhello (всего исправлений: 1)
Ответ на: комментарий от tcpfinhello

Не стояло, но это не отменяет, что подход телеги в этом плане - говно. Они сжимают звук, не используют шумоподавление нормальное. В итоге проблемы.

Хотя, если так посмотреть - в этом плане хватит и самописного прямого потока, который клепается на коленке за день.

Это я так, профдеформация попарла, извиняюсь весь в мыслях как раз на эту тему и ушел не туда.

LightDiver ★★★★★
()
Ответ на: комментарий от vtVitus

Раньше были википidory, а теперь ИИпidory :-))))))

Странно считать pidory тех, кто высказывается опираясь хоть на что-то внешнее, по отношению ко внутренностям своей головы) Наоборот похвально стремление привести цитаты, опереться на источники. Это гораздо ценнее, чем «я уверен», «я считаю», «я точно знаю»… Источник может быть плох или «очевидно плох» (кому-то очевидно, кому-то нет), но это точно в разы круче и научно, чем «я думаю».

tcpfinhello
() автор топика
Последнее исправление: tcpfinhello (всего исправлений: 1)
Ответ на: комментарий от tcpfinhello

Почему надо обязательно жрать 2 гига на поддержку соединений до 50 клиентов не очень ясно.

Потому что сервер написан на питоне рукожопами, вестимо.
Есть версии на других языках, они полегче, но всё, что я слышал от разворачивавших любых их версии у себя — это, что оно оно жручее как не в себя.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

На питоне не обязательно быть рукожопом, чтобы оно жрало. Просто он сам по себе такой.. Ты посмотри просто размер самой мелкой переменной на питоне. Там все обернуто так, что оно не может не жрать.

Там объект «ничего» весит 16 байт. Это самый маленький, если что.

Второй по размеру 48 байт!!! Это уже полноценная переменная. Ну почти. Это все еще пустой кортеж.

Пустая строка 49 байт. Плюс каждыйы символ. Плюс если кирилица - по 2 байта. Если эмодзи там по 4. Короче, это норма для него.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 5)
Ответ на: комментарий от LightDiver

На питоне не обязательно быть рукожопом, чтобы оно жрало. Просто он сам по себе такой..

И это тоже :)

Ты посмотри просто размер самой мелкой переменной на питоне. Там все обернуто так, что оно не может не жрать.

Да. Это, кстати, одна из причин, почему я всегда был и буду против обучения погромистике с этого языка: оно не учит думать.

Хотя, конечно, тут ещё вопрос, скажем так, планки, с которой считать «жручесть». Я пару лет назат писал парсер, задачей которого было дёрнуть по API довольно жирную пачку жсонов, разобрать их и сложить определённым образом в БД, которая потом скармливалась сфинксу. Я стараюсь код писать думая, ничего лишнего не оставляя и следя за логикой, но всё равно при запуске оно ело где-то в районе 60 мегабайт, хотя висело в лупе где-то минт 5. Вот тут дальше вопрос — это считать большим потреблением или нет? Я уверен, что написав то же самое на хотя бы Go можно было бы добиться потребления раза в два меньше. Но надо ли было (опустим момент, что так истерически сложилось, что парсеры были на пистоне)?

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Ну ладно, значит верю что можно сделать лучше. Не будем сраццо про пейтон. Здесь как в любом деле можно что угодно сделать хорошо и сделать плохо, видимо, например входные двери для квартир)

tcpfinhello
() автор топика
Ответ на: комментарий от Zhbert

Вот этим меня и покорил в первую очередь раст. Как я обычно пилил утилиты? Запилил и с тоской наблюдаешь рост памяти… Особенно на си. А раст со старта - запилил я утилиту, запускаю - 1.4мб озу. Через неделю смотришь - 1.2мб озу.

Я пилил разные варианты установщика аддонов под игру и прошел все это. Первоначальный был на питоне, потом на раст, потом на электроне.

В целом потребление памяти это не самое страшное. Электрон вон и побольше жрет.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Как я обычно пилил утилиты? Запилил и с тоской наблюдаешь рост памяти…

Я так как-то намудрил с вызовами коннектора к БД в гошечке. Ну точней продолбался в глаза и вместо обращения по указателю каждый раз создавал новый. И оно работало, только память росла геометрически: причем на рабочем маке оно отрабатывало (улетая в своп, который на быстром диске незаметен), а на сервере привело к тому, что сервер просто падал :) Ну то есть там не просто чуть, там за секунды до 20+ гигов улетало.

Так что да, нарукожопить можно на любом языке :)

Zhbert ★★★★★
()
Последнее исправление: Zhbert (всего исправлений: 1)
Ответ на: комментарий от Zhbert

У меня сейчас в игре в аддоне что то выжирает 300 кб озу в секунду… Доходит до 60мб, там сборщик мусора очищает до 5мб и заново. И я не могу найти где. Это 86+ тысяч строк кода с перекрестными ссылками друг на друга в разных файлах… Иногда без структуры. Пришлось пока смириться.

LightDiver ★★★★★
()
Ответ на: комментарий от tcpfinhello

Короче, пообщался ещё с чадботом, и сделал вывод, что если ты говнокодишь свой мессенджер с джентельменским набором функций, ты в итоге переизобретаешь XMPP. В этом есть смысл, если например ты хочешь более современный стэк (rust/go, json и т.д.) или оверлей мэш (yggdrasil/reticulum). А так-то проще всего взять старый добрый XMPP.

yvv1 ★★
()
Ответ на: комментарий от yvv1

Кстати, да. Исходники XMPP и сервера, и клиента все у ИИ-шечки есть, пусть г..внокодит на (rust/go, json и т.д.)

tiinn ★★★★★
()
Ответ на: комментарий от skiminok1986

https://ns.fiber-gate.ru/

Год уже как создал. Да, может что то не допилено еще, но ведь я всегда тут. Пишем, что надо и я допиливаю. Правда здорово?

Вот сейчас клиент перепишу на ts и займусь допиливанием.

А вся прелесь в том, что можно сделать вообще все, что хочется. Ограничено фантазией. Ну и чуток временем.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Если это managed язык, то просто делаешь дамп памяти и смотришь, каких объектов больше чем надо. С unmanaged по идее тоже можно, но скорее всего несколько сложнее, надо смотреть возможности конкретных профилировщиков памяти. В целом более-менее типовая задача.

MirandaUser2 ★★
()
Ответ на: комментарий от MirandaUser2

Да никак. Тупые набросы. Игнорируем, не срёмся товарищи!

tcpfinhello
() автор топика
Ответ на: комментарий от MirandaUser2

Это луа. https://github.com/Vladgobelen/NSQC3

Но, что самое мерзкое, там единая область памяти для всех аддонов то есть гадить может и не он вообще, а любой сторонний, а записывается ему. Начинаешь тестировать, через полчаса картина радикально менется - код не менял вообще. Но где то сбросилась какая то таблица и все изменилось.

Причем это весьма ограниченная песочница со своим очень урезанным луа5.1.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от MirandaUser2

Как связаны протокол и стек?

Берешь протокол и пишешь на твоем любимом ЯП.

Дело в том что та же самая функциональность, что у XMPP, может быть гораздо проще реализована на современном стэке, но это уже будет другой протокол.

yvv1 ★★
()

У тебя требования несколько противоречивые:
1) корпоративный сервер на 500 сотрудников завода и работа в глухом подвале на GPRS. Для сотрудников на заводе поднимается WLAN, от интернета и нестабильных сотовых сетей не зависящий. Хотя я не понимаю, зачем на заводе именно IM, вместо раций что-ли?
2) про лимиты на частоту сообщений и ограниченние типов аттачмента, тоже не понятно. От кого/чего это защита в закрытом контуре?

Отмечу также, что в корп. сети обычно вообще не применяется E2EE. Вся рабочая переписка является собственностью работодателя и должна быть доступна центральному серверу.

MirandaUser2 ★★
()
Последнее исправление: MirandaUser2 (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)