通信服务器群集——跨服务器通信Demo(源码)

简介:   对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求。出现这种需求的场景类似于下面描述的这种情况。   假设,我们一台TCP应用服务器能同时承载10000人同时在线,而同时在线用户数量通常为5万多,那可想而知,我们需要部署6台TCP应用服务器来分担这些负载。

  对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求。出现这种需求的场景类似于下面描述的这种情况。

  假设,我们一台TCP应用服务器能同时承载10000人同时在线,而同时在线用户数量通常为5万多,那可想而知,我们需要部署6台TCP应用服务器来分担这些负载。再假设,我们的应用中,任意的两个客户端都有可能需要互发消息(比如,传送文件),这时问题就来了 -- 因为要互发消息的这两个客户端连接的可能是不同的服务器。

  如何解决了?这就需要引入群集平台的概念。群集平台中有一个应用群集管理服务器ACMS可以将所有的TCP应用服务器管理起来,并且能在它们之间转发消息。这样,即使位于不同的TCP应用服务器上的客户端之间也可以相互发送消息了。结构模型简化后如下所示:

    

  以上图为例,两个客户端Client01与Client02分别连上不同的应用服务器AS01和AS02,我们假设由于路由器的原因(比如两个路由器的NAT类型都是Symmetric),Client01与Client02之间的P2P通道没有建立成功。此时,如果Client01与Client02之间要相互沟通信息,那么信息就会经过ACMS中转。比如Client01要发信息给Client02,信息经过的路线将会是:Client01 => AS01 => ACMS => AS02 => Client02。 

  能简单地实现这种模型吗?并且让这种跨服务器通信对于客户端而言是透明的?当然,基于ESPlatform群集平台,我们很容易做到这一点。 本文我们就实现一个这样的demo。我们之前有个老的简单的IM的Demo,它演示了客户端与服务器、以及客户端与客户端之间的基本通信功能。只不过,在那个Demo中,相互通信的客户端连上的是同一个服务端。本文的Demo就是在那个老Demo的基础上来进行升级,使得位于不同服务器上的两个客户端之间也可以相互通信。

一.Demo项目结构

  本Demo总共包含4个项目。

1.ESPlatform.ACMServer:这个是基于ESPlatform的应用群集服务器ACMS。

2.ESPlatform.SimpleDemo.Core:用于定义公共的信息类型、通信协议。

3.ESPlatform.SimpleDemo.Server:Demo的服务端。

4.ESPlatform.SimpleDemo.Client:Demo的客户端。 

二.应用群集管理服务器ACMS

  我们不需要对ACMS进行任何修改,只需要关注配置文件中TransferPort和Remoting端口的值。

<configuration>  
  <appSettings>  
    <!--应用群集中的服务器分配策略-->
    <add key="ServerAssignedPolicy" value="MinUserCount"/>
    <!--用于在AS之间转发消息的Port-->
    <add key="TransferPort" value="12000"/>
  </appSettings>
  
  <system.runtime.remoting>         
    <application>
      <channels>
        <!--提供IPlatformCustomizeService和IClusterControlService Remoting服务的Port-->
        <channel ref="tcp" port="11000" >
          <serverProviders>
            <provider ref="wsdl" />
            <formatter ref="soap" typeFilterLevel="Full" />
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
          <clientProviders>
            <formatter ref="binary" />
          </clientProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

 三.Demo服务端

  在升级老的Demo时,首先需要添加ESPlatform.dll的引用,然后,使用ESPlatform.dll程序集中的ESPlatform.Rapid.RapidServerEngine替代ESPlus.Rapid.RapidServerEngine,并在构造函数中指定:当前服务端实例的ID、ACMS的IP地址及其TransferPort和Remoting端口。

    //使用简单的好友管理器,假设所有在线用户都是好友。(仅仅用于demo)
    ESPlatform.Server.DefaultFriendsManager friendManager = new ESPlatform.Server.DefaultFriendsManager();                
    this.engine = new ESPlatform.Rapid.RapidServerEngine(int.Parse(this.textBox_serverID.Text), this.textBox_acmsIP.Text, int.Parse(this.textBox_acmsPort.Text) ,int.Parse(this.textBox_transferPort.Text));
    this.engine.FriendsManager = friendManager;
    this.engine.Initialize(int.Parse(this.textBox_serverPort.Text), new CustomizeHandler(), new BasicHandler());
    friendManager.PlatformUserManager = this.engine.PlatformUserManager;

    其它的部分与老Demo完全一致。 

四.Demo客户端

  相对于老的Demo而言,客户端的修改非常小,只是将配置文件中的服务器的IP和端口移到了登录界面上,这样方便指定要连接的服务端的地址。除此之外,没有其它变化,甚至,客户端的项目都不需要引用ESPlatform.dll。 

五.运行Demo

1.启动应用群集管理服务器ACMS。

2.启动第一个服务端,ServerID指定为0,监听6000端口。

3.启动第二个服务端,ServerID指定为1,监听6001端口。

4.启动第一个客户端,连接ServerID为0的服务端。

5.启动第二个客户端,连接ServerID为1的服务端。

6.两个客户端之间可以相互对话了。

(在正式的应用场景中,ACMS、两个服务端、两个客户端 可以部署在不同的机器器上)

  下图是Demo运行起来的效果:

     

  题外话:从上图中可以看到,ACMS实时知道每台应用服务器的在线人数、CPU利用率、内存利用率等信息,基于这些信息,我们可以轻松实现简单的负载均衡的机制 -- 比如,党有一个新的客户端要登录时,我们可以指派它去连接那个在线人数最少的应用服务器,或者,CPU利用率最低的应用服务器。

六.Demo下载

  群集、跨服务器通信Demo源码

 

 

 

 

目录
相关文章
|
2月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
42 6
|
2月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
2月前
|
运维 安全 网络安全
运维笔记:基于阿里云跨地域服务器通信
运维笔记:基于阿里云跨地域服务器通信
86 1
|
2月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
71 0
|
2月前
|
Java
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
|
3月前
|
SQL DataWorks Java
DataWorks操作报错合集之在与某个数据库服务器建立或保持通信连接时遇到报错,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
1月前
|
Cloud Native Java 编译器
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
随着云计算技术的不断发展,云服务商们不断推出高性能、高可用的云服务器实例,以满足企业日益增长的计算需求。阿里云推出的倚天实例,凭借其基于ARM架构的倚天710处理器,提供了卓越的计算能力和能效比,特别适用于云原生、高性能计算等场景。然而,有的用户需要将传统基于x86平台的应用迁移到倚天实例上,本文将介绍如何将基于x86架构平台的应用迁移到阿里云倚天实例的服务器上,帮助开发者和企业用户顺利完成迁移工作,享受更高效、更经济的云服务。
将基于x86架构平台的应用迁移到阿里云倚天实例云服务器参考
|
28天前
|
编解码 前端开发 安全
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘
在我们选购阿里云服务器的过程中,不管是新用户还是老用户通常都是通过阿里云的活动去买了,一是价格更加实惠,二是活动中的云服务器配置比较丰富,足可以满足大部分用户的需求,但是面对琳琅满目的云服务器实例、带宽和云盘选项,如何选择更适合自己,成为许多用户比较关注的问题。本文将介绍如何在阿里云的活动中选择合适的云服务器实例、带宽和云盘,以供参考和选择。
通过阿里云的活动购买云服务器时如何选择实例、带宽、云盘
|
26天前
|
弹性计算 运维 安全
阿里云轻量应用服务器和经济型e实例区别及选择参考
目前在阿里云的活动中,轻量应用服务器2核2G3M带宽价格为82元1年,2核2G3M带宽的经济型e实例云服务器价格99元1年,对于云服务器配置和性能要求不是很高的阿里云用户来说,这两款服务器配置和价格都差不多,阿里云轻量应用服务器和ECS云服务器让用户二选一,很多用户不清楚如何选择,本文来说说轻量应用服务器和经济型e实例的区别及选择参考。
阿里云轻量应用服务器和经济型e实例区别及选择参考