首页 > 解决方案 > 移动应用的 TCP 通信和 Rest API 的结合

问题描述

我在 google play 上发布了一个移动应用程序,目前它与大约 6k-8k 的同时用户运行良好。实际上,我需要一些帮助来重新设计服务器和 android 客户端之间的架构和通信流程。这是场景。

专用网络上的 1- 1-linux 服务器。无法从互联网访问。

2- 1-公共网络上的 Windows 服务器。

3- 1-移动应用程序。

沟通是这样进行的。

来自移动设备的每个请求都通过在 asp.net 中使用 C# 开发的 Rest API 登陆 Windows 应用程序服务器。然后其余 API 通过 TCP 协议与 linux 服务器通信。从 linux 服务器获取数据并通过 REST API 将其发送回应用程序。这适用于大约 8k 的少量用户。主要问题是由于 TCP 限制,windows 应用服务器和 linx 服务器之间的通信。

REST API 之间的通信是 linux 服务器是

Rest API 使用服务器 IP 和 PORT 为每个新请求创建一个 TCP 套接字,然后

      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. 

由于来自移动用户的大量请求,上述步骤一次又一次地重复,最终阻塞了服务器上的端口。在与服务器所有者讨论后,我必须与 linux 服务器创建一个长 TCP 会话,该会话将始终保持连接,并且所有请求都将通过此通道发送,而无需每次都断开/处理套接字并重新创建。我想要一种与 linux 服务器建立长 TCP 会话的方法。但这对于 Rest API 是不可能的。我的观点是如何在当前情况下实现这一目标。我有 C# 和 dotnet 的平台限制。作为一名 android 开发人员,我对 dotnet 了解不多。任何帮助都将得到极大的利用。

标签: c#.netresttcpservertcpsocket

解决方案


使用 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 成为初始HTML 屏幕的onload 函数,以便首先实例化连接。

使用 XHR 的问题在于,即使浏览器关闭了套接字,服务器平台也可能泄漏套接字资源。基于 Windows 的平台肯定会。WebSocket 连接在请求之间是持久的,因此不会造成资源泄漏问题。


推荐阅读