Комбинация TCP-связи и Rest API для мобильного приложения

#c# #.net #rest #tcpserver #tcpsocket

#c# #.net #rest #tcpserver #tcpsocket

Вопрос:

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

1- 1-сервер Linux в частной сети. Недоступен из Интернета.

2-1- Сервер Windows в общедоступной сети.

3-1-Мобильное приложение.

Обмен данными происходит следующим образом.

Каждый запрос с мобильных устройств попадает на сервер приложений Windows через Rest API, разработанный в asp.net использование C #. Затем rest API обменивается данными с сервером Linux по протоколу TCP. Извлекает данные с сервера Linux и отправляет их обратно в приложение через rest API. Это хорошо работает для небольшого числа пользователей, около 8 тыс. Основная проблема заключается в обмене данными между Windows application Server и linx server из-за ограничения TCP.

Связь между rest API и сервером Linux является

Rest API создает TCP-сокет, используя IP-адрес сервера и ПОРТ для каждого нового запроса, а затем

       1-Logins to system using username and password
      2-Sends the command to get specific data. 
      3-Receives the desired data. 
      4-Logouts from linux server. 
      5-Disposes off the socket and sends this result to mobile application. 
  

Из-за большого количества запросов от мобильного пользователя вышеуказанные шаги повторяются снова и снова, что в конечном итоге приводит к блокировке порта на сервере. После обсуждения с владельцем сервера я должен создать длительный TCP-сеанс с сервером Linux, который будет оставаться подключенным в течение всего времени, и все запросы будут отправляться по этому каналу без отключения / утилизации сокета каждый раз и повторного создания. Мне нужен способ организовать длительный TCP-сеанс с сервером Linux. Но это невозможно с Rest API. Я хочу сказать, как я могу достичь этого в текущем сценарии. У меня есть ограничение в виде платформы для C # и dotnet. Я не очень разбираюсь в dotnet, поскольку являюсь разработчиком Android. Любая помощь будет с благодарностью принята.

Ответ №1:

Как насчет использования WebSocket для вашего постоянного соединения? В JavaScript код выглядит примерно так:

 var theSocket = null;
function interactServer() {
    theSocket = new WebSocket(document.URL.replace("http", "ws"));
    theSocket.onopen = function() {theSocket.onopen = null; notifyServer(<initialization request>);};
    theSocket.onmessage = function(event) {<function to handle a message>(event.data);};
    theSocket.onclose = function() {<cleanup code>};
    }
  

где notifyServer — это функция, которая отправляет запрос REST на сервер. Сделайте interactServer функцией onload для вашего начального HTML-экрана, чтобы первым делом был создан экземпляр соединения.

Проблема с использованием XHR заключается в том, что серверная платформа может пропускать ресурсы сокета, даже когда браузер закрывает сокет. Платформа на базе Windows, безусловно, будет. Соединение с WebSocket является постоянным для всех запросов и, следовательно, не создает проблемы с утечкой ресурсов.