#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 является постоянным для всех запросов и, следовательно, не создает проблемы с утечкой ресурсов.