我在Google Play上发布了一个移动应用程序,它目前在大约6k-8k的同时用户中运行良好。实际上,在这里我需要一些帮助来重新设计服务器和android客户端之间的体系结构和通信流程。这是场景。
1- 1-linux服务器在专用网络上。无法通过互联网访问。
2-1-公用网络上的Windows服务器。
3-1移动应用程序。
通信是这样的。
每个来自移动设备的请求都通过使用C#在asp.net中开发的Rest API到达Windows应用程序服务器。然后,其余的API通过TCP协议与linux服务器通信。从linux服务器获取数据,并通过rest API将其发送回应用程序。这对于8k左右的少量用户来说效果很好。主要问题是由于TCP限制,Windows应用程序服务器和linx服务器之间的通信。
其余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的了解不多。任何帮助将不胜枚举。
答案 0 :(得分:0)
如何使用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连接在请求之间是持久的,因此不会造成资源泄漏问题。