头图

本系列的前两篇文章,我们已经分别介绍了如何使用 ABAP Push Channel,实现 TCP 通讯场景中的 TCP 服务器端和客户端。

SAPGUI 无疑是 Client / Server 应用软件架构下的一款经典软件。C/S 架构是客户端和服务器端的直接通信模式。在这种架构下,客户端是运行在用户设备上的应用程序,而服务器则负责处理数据和业务逻辑。C/S 架构的一个关键特征是,客户端具有较高的逻辑处理能力:不仅能显示用户界面,还能执行一定的业务逻辑和数据处理。

在 C/S 模式中,数据传输是基于特定协议的,如 TCP/IP 协议,通信相对稳定。客户端应用一般需要预先安装,安全性相对较高,因为应用开发者可以对应用进行更为严格的安全控制。

千禧年之后,随着宽带网络的逐渐普及,Browser / Server 架构开始在应用软件领域大行其道。

B/S 架构下,客户端不再是专门的应用程序,而是通过浏览器来访问服务器上的应用。这种模式的一个显著优势是客户端的轻量化,只需要通过浏览器即可使用系统。

用户不需要安装专门的软件,只要有浏览器和网络,就可以访问 B/S 架构的应用。这大大降低了用户的使用门槛和维护成本。

因为客户端只是浏览器,B/S 架构具有很好的跨平台特性。无论用户使用的是 Windows、macOS 还是 Unix/Linux,只要有浏览器,就可以访问系统。

本系列之前介绍的 TCP Socket 场景,无法直接在浏览器环境里工作。出于安全因素考虑,浏览器不支持直接调用系统底层的 Socket.

于是出现了一项新的技术:Web Socket.

Web Socket 是一种双向通信协议,在通过 HTTP 建立初始连接后,Web Socket 服务器和 Browser/客户端,都能主动的向对方发送或接收数据。

ABAP 开发人员可以简单讲 Web Socket 理解成为一种加强版的能够在浏览器端工作的 TCP Socket.

朋友们若是按照本系列前两篇文章,完成了 TCP Socket 的客户端和服务器端编程的话,会发现 Web Socket 服务器端的创建步骤,同 TCP Socket 服务器端几乎如出一辙。

更准确的说,同 TCP Socket 相比,Web Socket 服务器端的实现还省去了一个步骤,因为 Web Socket 基于 HTTP 协议建立客户端与服务器端的连接,所以不用像 TCP Socket 那样还得去 SMICM 事务码里新开一个 TCP 端口。

既然已经有了之前 TCP Socket 编程的基础,本文快速介绍 Web Socket 服务器端的实现步骤。

在事务码 SAPC 里创建一个 Web Socket 应用,取名 YWSP_TEST.

Connection Type 类型设置为 Web Socket,点击 Generate Class and Service 按钮,生成服务器对应的 ABAP Handler Class.

实现这个 ABAP 类的两个方法。

ON_START

在 Web Socket 客户端与服务器端成功连接时,该方法触发。

服务器端可以在该方法里向客户端发送一些欢迎消息。

METHOD if_apc_wsp_extension~on_start.
    TRY.
        " send the message on websocket connection
        DATA(lo_message) = i_message_manager->create_message( ).
        lo_message->set_text( |{ sy-mandt }/{ sy-uname }: ON_START has been successfully executed !| ).
        i_message_manager->send( lo_message ).
      CATCH cx_apc_error INTO DATA(lx_apc_error).
        MESSAGE lx_apc_error->get_text( ) TYPE 'E'.
    ENDTRY.
  ENDMETHOD.

ON_MESSAGE

当 Web Socket 服务器端收到来自连接另一端的客户端发送过来的消息时,该方法触发。

通过方法输入参数 i_message 提供的 get_text 方法,提取出客户端发送的消息详细内容。然后调用另一个输入参数 i_message_manager, 创建消息实例,将消息回复给客户端。

本例的 ON_MESSAGE 方法里,先后发送两条消息给客户端。

第一条消息是硬编码的打印信息。第二条消息将客户端发送的消息内容,原封不动地发送回客户端。

  METHOD if_apc_wsp_extension~on_message.
    TRY.
        " 提取客户端发送过来的消息内容
        DATA(lv_text) = i_message->get_text( ).

        DATA(lo_message) = i_message_manager->create_message( ).

        " 发送第一条通知消息给客户端
        lo_message->set_text( |{ sy-mandt }/{ sy-uname }: ON_MESSAGE has been successfully executed !| ).
        i_message_manager->send( lo_message ).

        " 发送第二条消息给客户端,消息内容就是客户端发送过来的原始消息
        lo_message->set_text( lv_text ).
        i_message_manager->send( lo_message ).
      CATCH cx_apc_error INTO DATA(lx_apc_error).
        MESSAGE lx_apc_error->get_text( ) TYPE 'E'.
    ENDTRY.
  ENDMETHOD.

在事务码 SAPC 里激活这个 Web Socket 应用,然后就可以测试了。

SAP 发布了一个标准的 ABAP Webdynpro 应用,可以用来作为 Web Socket 客户端。SE80 里启动 WDR_TEST_APC_WSP 应用。

在 APC Application 输入字段里,输入我们刚刚激活的 YWSP_TEST,该 ABAP Webdynpro 应用会自动向这个 Web Socket 服务器发起连接,然后在页面上看到 Connected 的提示(下图图例2)。

此时该 ABAP Webdynpro 应用作为 Web Socket 通讯的客户端,收到了我们之前在服务器实现 ON_START 方法里硬编码的字符串信息:ON_START has been successfully executed!

在 Message 输入框里编辑客户端想要发送到服务器端的消息,点击 Send 按钮:

这会触发服务器端的 ON_MESSAGE 方法。

最后 ABAP Webdynpro 应用作为客户端,收到来自服务器端回复的两条消息:

本系列的后续文章,笔者会介绍如何开发一个 SAP UI5 应用,作为 Web Socket 的客户端,同本文开发的 Web Socket 服务器端交互。欢迎大家关注。


注销
1k 声望1.6k 粉丝

invalid