Ошибка тайм-аута при получении ответа через Push-канал ABAP (сокет TCP)

#websocket #abap #tcpsocket

#websocket #abap #tcpsocket

Вопрос:

В настоящее время я работаю над Push-каналом ABAP в сокете TCP и создаю соединение между системой SAP ABAP и внешним устройством.

Проблема в том, что мой Push-канал ABAP не может получить или отобразить ответ от устройства с ошибкой тайм-аута!, но это не тот случай, когда я использую ncat

Вот код:

 PARAMETERS: host TYPE string DEFAULT 'xxx.xxx.xxx.xxx', " ip adress reciever
            port TYPE string DEFAULT '11300',
            "text TYPE string DEFAULT 'GET /outputaccess0?PW=Intecio!amp;State=ONamp;' LOWER CASE,
            kommand(1) AS LISTBOX VISIBLE LENGTH 10.


DATA text TYPE string.

AT SELECTION-SCREEN OUTPUT.

TYPE-POOLS: vrm.
DATA:
name TYPE vrm_id,
list TYPE vrm_values,
value TYPE vrm_value.
name = 'KOMMAND'. " Name should be in UPPER CASE

value-key = '1'.
value-text = 'Test1'.
APPEND value TO list.
value-key = '2'.
value-text = 'test2'.
APPEND value TO list.
value-key = '3'.
value-text = 'Test3'.
APPEND value TO list.
value-key = '4'.
value-text = 'est4'.
APPEND value TO list.

CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = list
EXCEPTIONS
id_illegal_name = 0
OTHERS = 0.

INITIALIZATION.
  host = cl_gui_frontend_services=>get_ip_address( ).
  "CONCATENATE '11' '300' INTO port.
  DATA terminator TYPE string.



CLASS apc_handler DEFINITION FINAL .
  PUBLIC SECTION.
    INTERFACES if_apc_wsp_event_handler.
    DATA       message TYPE string.
ENDCLASS.

"Step 2: Implement event handler to get events (on_start, on_message, on_close)
CLASS apc_handler IMPLEMENTATION.
  METHOD if_apc_wsp_event_handler~on_open .
    "message = 'Connection opned!'.
  ENDMETHOD.

  METHOD if_apc_wsp_event_handler~on_message.
    TRY.
        message = i_message->get_text( ).
        DATA(lo_message) = i_message_manager->create_message( ).
        "Cut of '0A' terminator
        DATA(len) = strlen( message ) - 1.
        message = message(len).
       "message = 'TEST'.
      CATCH cx_apc_error INTO DATA(apc_error).
        message = apc_error->get_text( ).
    ENDTRY.
 ENDMETHOD.

  METHOD if_apc_wsp_event_handler~on_close.
   message = 'Connection closed!'.
  ENDMETHOD.

  METHOD if_apc_wsp_event_handler~on_error.
    message = 'Connection interrupted !!'.
  ENDMETHOD.
ENDCLASS.

CLASS apc_demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS apc_demo IMPLEMENTATION.
  METHOD main.

  IF kOMMAND = 1.
      text = 'Kommand1'.
  ELSEIF KOMMAND = 2.
      text = 'Kommand2'.
  ELSEIF KOMMAND = 3.
      text = 'Kommand3'.
  ELSEIF KOMMAND = 4.
      text = 'ommand4'.
  ELSE.
    text = 'test'.
  ENDIF.

    TRY.
        "Create event handler
        DATA(event_handler) = NEW apc_handler( ).

        "Step 1: specify TCP frame information
        terminator = `0A`.

        DATA client TYPE REF TO if_apc_wsp_client.

        "Step 3: create TCP client object and connect it to server
        client = cl_apc_tcp_client_manager=>create(
          i_host   = host
          i_port  = port
          i_frame = VALUE apc_tcp_frame(
            frame_type =
              if_apc_tcp_frame_types=>co_frame_type_terminator
            terminator =
              terminator )
          i_event_handler = event_handler ).

        client->connect( ).

        "Send initial 'hello' message from client

        DATA(message_manager) = CAST if_apc_wsp_message_manager(
          client->get_message_manager( ) ).
        DATA(message) = CAST if_apc_wsp_message(
          message_manager->create_message( ) ).
        DATA(binary_terminator) = CONV xstring( terminator ).
        DATA(binary_msg) = cl_abap_codepage=>convert_to( text ).
        CONCATENATE binary_msg binary_terminator
               INTO binary_msg IN BYTE MODE.
        message->set_binary( binary_msg ).

        message_manager->send( message ).

        "Step 4: Wait for incoming messages from server
        CLEAR event_handler->message.
        WAIT FOR PUSH CHANNELS
             UNTIL event_handler->message IS NOT INITIAL UP TO 5 SECONDS.
        IF sy-subrc = 4.
         WRITE: 'No handler for APC messages registered!' .
        ELSEIF sy-subrc = 8.
          WRITE: 'Timeout occured!'.
        ELSE.
          WRITE: 'TCP client received: '.
          WRITE: event_handler->message.
        ENDIF.
        client->close( i_reason = 'Application closed connection!' ).
      CATCH cx_apc_error INTO DATA(apc_error).
        WRITE: apc_error->get_text( ).
    ENDTRY.

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  apc_demo=>main( ).
 

Комментарии:

1. Итак, где ваша программа ABAP?

2. я только что добавил его сейчас

3. Сейчас я сталкиваюсь с той же проблемой, вы ее решили? Метод события «on_message» не вызывается, но я могу проверить, что сообщение было получено и ответ был отправлен от цели после инструкции message_manager-> отправить (сообщение).

4. Я решил это, изменив байты-терминаторы с ‘0A’ на ’00’. Но я думаю, что это зависит от реализации сервера, поэтому, вероятно, не является допустимым решением во всех случаях.