SocketFilter

该插件主要是对客户端发送的报文进行接收,并按照一定的格式对报文的内容进行读取和解析。同时,还可以对处理后的报文内容或者是指定的内容发送给客户端,实现客户端和服务端之间的报文交互。

插件配置

  • SocketFilter插件所在位置:lib==>be-esb-plugin-base-2.0.jar==>com==>brilliance==>eibs==>core==>service==>instance==>impl==>SocketFilter
  • SocketFilter插件需要继承插件共有的父类AbsFilter

1666060649736

  • commons.xml的filters中注册该插件,该插件无parameter属性
<filter id="socketFilter" class="SocketFilter"/>
  • SocketFilter插件配置
属性 说明
id 注册时指定的id命名属性,后续在使用时通过该名称进行插件的调用
class 声明插件时映射的插件类的位置,指向该插件的类文件,注意插件存放的包结构必须严格保持一致才可生效(com.brilliance.eibs.core.service.instance.impl)
  • 客户端需要建立与服务端的连接需要配置socketClientConnection,需要对其进行配置
    • 该插件类的位置和SocketFilter插件类位置相同,同样,需要在commons.xml的connections中注册该插件
    • 该类继承AbsConnection连接插件共同父类
    • 插件属性类似上述filter插件,在此不再赘述
<connection class="SocketClientConnection" id="socketClientConnection"/>

属性配置

属性 描述 是否必须 示例
ref 引用插件名称 引用commons.xml注册的SocketFilter插件指定的id值
type 指定插件功能类型 type属性值分为out和in。out表示组报发报;in表示收报解报
encoding 报文编码 指定收报解报的编码格式,一般为UTF-8

示例

客户端socket连接属性配置示例

  • 首先在客户端设置相应的连接参数
<connection ref="socketClientConnection"><!--指定相应的连接插件-->
    <property name="ip" value="127.0.0.1" /><!--指定连接的服务端ip地址-->
    <property name="port" value="10018" /><!--指定连接的端口号-->
    <property name="send_timeout" value="20000" /><!--发送超时时间,为0则不限时间,单位ms-->
    <property name="receive_timeout" value="0" /><!--接收超时时间-->
</connection>
  • 然后在services.xml的services中配置连接信息
    • 主要是port、interfaceName、transactionName三个属性需要严格对应
    • 有默认属性的值可以不配置,采用默认属性
<service id="gjserverlx" state="on" type="socket"><!--state属性表示服务器开启状态-->
    <property name="port" value="10018" /><!--指定连接的端口号,需要和客户端连接端口号保持一致-->
    <property name="trust_ip" value="*" /><!--服务端的ip地址,使用*号表示通配符-->
    <property name="thread_pool_size" value="25" /><!--线程池大小,不配置有默认属性-->
    <property name="request_queue_len" value="500" /><!--请求队列长度,不配置有默认属性-->
    <property name="receive_timeout" value="0" /><!--接收超时时间,0表示不限时长-->
    <property name="interfaceName" value="test1" /><!--接口的名称,注意和服务器端接口名保持一致-->
    <property name="transactionName" value="socketserver" /><!--服务器端交易名,需要和服务器端名称保持一致-->
</service>

socket客户端发报及接收回调

<!--客户端-->
<transaction id="socketclient" version="2.0">
    <step id="1">
        <!--读取本地的文件数据-->
        <connection ref="fileConnection" type="in">
            <property name="path" value="D:\brilliance\Be_Dea_LX\Be_Dea_LX\msg\socket.txt" />
        </connection>
        <!--获取文件的基本信息-->
        <filter ref="publicFilter" type="in">
            <field tag="msg" value="${this}" />
            <field tag="len" value="${msg.length()}"/>
        </filter>
        <!--设置socket连接-->
        <connection ref="socketClientConnection"><!--指定相应的连接插件-->
            <property name="ip" value="127.0.0.1" /><!--指定连接的服务端ip地址-->
            <property name="port" value="10018" /><!--指定连接的端口号-->
            <property name="send_timeout" value="20000" /><!--发送超时时间,为0则不限时间,单位ms-->
            <property name="receive_timeout" value="0" /><!--接收超时时间-->
        </connection>
        <!--对报文进行定长处理和拼接,0位为报文长度,1位为报文信息-->
        <filter ref="fixedFilter" type="out">
            <field etag="0" value="${len}" size="8" type="int"/>
            <field etag="1" value="${msg}"  size="${len}" />
        </filter>
        <!--通过socketFilter进行报文的发送-->
        <filter ref="socketFilter" type="out" encoding="#{ENCODE}">
            <field value="${this}"/>
        </filter>
        <!--通过socketFilter接收服务端返回的信息-->
        <filter ref="socketFilter" type="in" encoding="#{ENCODE}">
            <!-- 读8个字节 -->
            <field tag="len" etag="8"  type="int"/>
            <field tag="body" etag="${len}" type="string"/>
            <log value="${body}"/>
            <!--关流-->
            <field etag="close" />
        </filter>
    </step>
</transaction>

socket服务端收报及返回信息

<!--服务器端-->
<transaction id="socketserver" version="2.0">
    <step id="1">
        <filter ref="socketFilter" type="in" encoding="#{ENCODE}">
            <!-- 读8个字节 -->
            <field tag="len" etag="8"  type="int"/>
            <field tag="body" etag="${len}" type="string"/>
            <log value="${body}"/>
            <field tag="res" value="${body} ssss"/>
        </filter>
        <!-- 做业务逻辑 -->
        <filter ref="fixedFilter" type="out">
            <field etag="0" value="${res.length()}" size="8" type="int"/>
            <field etag="1" value="${res}"  size="${res.length()}" />
        </filter>
        <!-- 进行返回信息的发送 -->
        <filter ref="socketFilter" type="out" encoding="#{ENCODE}">
            <field value="${this}" />
        </filter>
    </step>
</transaction>

示例运行结果

  • 服务器端结果显示

1666075336765

  • 客户端结果显示

1666075373908

results matching ""

    No results matching ""