Java TCP按字节发送/检索标头

Java TCP按字节发送/检索标头,java,spring-integration,Java,Spring Integration,我有客户端配置: <beans:bean id="itemSerializerDeserializer" class="org.mbracero.integration.ItemSerializerDeserializer" /> <beans:bean id="resultSerializerDeserializer" class="org.mbracero.integration.ResultSerializerDeserializer" /> &

我有客户端配置:

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

<int-ip:tcp-connection-factory id="clientRequestData"
    type="client" host="${clientRequestData.host}" port="${clientRequestData.port}" single-use="true"
    serializer="itemSerializerDeserializer" deserializer="resultSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="requestDataOutGateway"
    request-channel="requestData" connection-factory="clientRequestData"
    request-timeout="10000" reply-timeout="10000" remote-timeout="10000" />
<int:channel id="channelServerRequestData" />
<int:channel id="channelServerResponseData" />

<beans:bean id="requestService" class="org.mbracero.integration.RequestService" />

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

<int-ip:tcp-connection-factory id="requestDataServer"
    type="server" port="${requestDataServer.port}" single-use="true" deserializer="itemSerializerDeserializer"
    serializer="resultSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="TCPInboundGateway"
    connection-factory="requestDataServer" request-channel="channelServerRequestData"
    reply-channel="channelServerResponseData" error-channel="errorChannel" />
以及服务器配置:

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

<int-ip:tcp-connection-factory id="clientRequestData"
    type="client" host="${clientRequestData.host}" port="${clientRequestData.port}" single-use="true"
    serializer="itemSerializerDeserializer" deserializer="resultSerializerDeserializer" />

<int-ip:tcp-outbound-gateway id="requestDataOutGateway"
    request-channel="requestData" connection-factory="clientRequestData"
    request-timeout="10000" reply-timeout="10000" remote-timeout="10000" />
<int:channel id="channelServerRequestData" />
<int:channel id="channelServerResponseData" />

<beans:bean id="requestService" class="org.mbracero.integration.RequestService" />

<beans:bean id="itemSerializerDeserializer"
    class="org.mbracero.integration.ItemSerializerDeserializer" />

<beans:bean id="resultSerializerDeserializer"
    class="org.mbracero.integration.ResultSerializerDeserializer" />

<int-ip:tcp-connection-factory id="requestDataServer"
    type="server" port="${requestDataServer.port}" single-use="true" deserializer="itemSerializerDeserializer"
    serializer="resultSerializerDeserializer" />

<int-ip:tcp-inbound-gateway id="TCPInboundGateway"
    connection-factory="requestDataServer" request-channel="channelServerRequestData"
    reply-channel="channelServerResponseData" error-channel="errorChannel" />
ItemSerializer序列化程序:

public class ItemSerializerDeserializer implements Serializer<Item>, Deserializer<Item> {
(...)
}
public class ResultSerializerDeserializer implements Serializer<Result>, Deserializer<Result> {
(...)
}
公共类ItemSerializerSerializer实现序列化程序、反序列化程序{
(...)
}
ResultSerializerDeserializer:

public class ItemSerializerDeserializer implements Serializer<Item>, Deserializer<Item> {
(...)
}
public class ResultSerializerDeserializer implements Serializer<Result>, Deserializer<Result> {
(...)
}
公共类ResultSerializerDeserializer实现序列化程序、反序列化程序{
(...)
}
现在我必须添加一些头(发送和检索),但我需要像上面写的自定义序列化器/反序列化器那样进行

例如,我需要发送下一个标题:

  • 发卡机构:4字节。初始位置1-最终位置4
  • 客户端:4字节。Ini位置5-最终位置8
  • 产品:2字节。Ini位置9-最终位置10
  • 类型:3字节。Ini位置11-最终位置13
  • (……)
我已经按字节和位置发送和检索了这些头(没有像Map那样按名称/值)

使用我的自定义序列化器/反序列化器,我可以处理有效负载,但我不知道如何处理头

我读过一些关于属性映射器的内容,但我不知道我的方法是否正确

在客户端配置中,类似于:

(...)
<int-ip:tcp-connection-factory id="clientRequestData"
    type="client" host="${clientRequestData.host}" port="${clientRequestData.port}" single-use="true"
    serializer="itemSerializerDeserializer" deserializer="resultSerializerDeserializer"
    mapper="mapper" />

<beans:bean id="mapper"
      class="org.springframework.integration.ip.tcp.connection.MessageConvertingTcpMessageMapper">
    <beans:constructor-arg name="messageConverter">
        <beans:bean class="??????????"/>
    </beans:constructor-arg>
</beans:bean>
(...)
(…)
(...)
有什么帮助吗


提前感谢。

使用带有
MapMessageConverter
MessageConvertingCPMessageApper

总体思路是,在出站时,转换器将
消息
转换为
映射
,该映射包含所有
标题
有效负载
,序列化程序将映射序列化为
字节[]
。您可以告诉
MapMessageConverter
您希望在映射中包含哪些头,以便您可以在序列化程序中访问它们

在入站端,反序列化程序从
字节[]
创建一个
映射
,然后
MessageConverter.toMessage()
将映射转换为
消息

有关示例,请参见

另见

编辑

这是一个简单的实现(对输出没有错误检查或长度检查)

private volatile反序列化程序packetDeserializer=new ByteArrayLfSerializer();
private volatile Serializer packetSerializer=new ByteArrayLfSerializer();
@凌驾
公共映射反序列化(InputStream InputStream)引发IOException{
byte[]bytes=readToEndOfMessage(inputStream);
String asString=新字符串(字节,“UTF-8”);
Map headers=newhashmap();
headers.put(“发行者”,关联子字符串(0,5));
headers.put(“客户机”,关联子字符串(4,9));
headers.put(“产品”,关联子字符串(9,11));
headers.put(“type”,asString.substring(11,14));
Map Map=newhashmap();
map.put(“标题”,标题);
put(“有效负载”,createPayloadFromRemainingBytes(字节));
返回图;
}
@凌驾
公共void序列化(映射对象,OutputStream OutputStream)引发IOException{
Map headers=(Map)object.get(“headers”);
outputStream.write(headers.get(“issuer”).getBytes(“UTF-8”);
outputStream.write(headers.get(“客户端”).getBytes(“UTF-8”);
outputStream.write(headers.get(“产品”).getBytes(“UTF-8”);
outputStream.write(headers.get(“type”).getBytes(“UTF-8”);
write(convertPayloadToBytes(object.get(“payload”));
}

MapMessageConverter
一起使用时,Spring集成头将与数据一起传送到另一端,他将解码数据并使用这些头创建入站消息。

MessageConvertingCmpessageMapper
MapMessageConverter一起使用

总体思路是,在出站时,转换器将
消息
转换为
映射
,该映射包含所有
标题
有效负载
,序列化程序将映射序列化为
字节[]
。您可以告诉
MapMessageConverter
您希望在映射中包含哪些头,以便您可以在序列化程序中访问它们

在入站端,反序列化程序从
字节[]
创建一个
映射
,然后
MessageConverter.toMessage()
将映射转换为
消息

有关示例,请参见

另见

编辑

这是一个简单的实现(对输出没有错误检查或长度检查)

private volatile反序列化程序packetDeserializer=new ByteArrayLfSerializer();
private volatile Serializer packetSerializer=new ByteArrayLfSerializer();
@凌驾
公共映射反序列化(InputStream InputStream)引发IOException{
byte[]bytes=readToEndOfMessage(inputStream);
String asString=新字符串(字节,“UTF-8”);
Map headers=newhashmap();
headers.put(“发行者”,关联子字符串(0,5));
headers.put(“客户机”,关联子字符串(4,9));
headers.put(“产品”,关联子字符串(9,11));
headers.put(“type”,asString.substring(11,14));
Map Map=newhashmap();
map.put(“标题”,标题);
put(“有效负载”,createPayloadFromRemainingBytes(字节));
返回图;
}
@凌驾
公共void序列化(映射对象,OutputStream OutputStream)引发IOException{
Map headers=(Map)object.get(“headers”);
outputStream.write(headers.get(“issuer”).getBytes(“UTF-8”);
outputStream.write(headers.get(“客户端”).getBytes(“UTF-8”);
outputStream.write(headers.get(“产品”).getBytes(“UTF-8”);
outputStream.write(headers.get(“type”).getBytes(“UTF-8”);
write(convertPayloadToBytes(object.get(“payload”));
}
MapMessageConverter
一起使用时,Spring集成头将与数据一起传送到另一端,他将解码数据并使用这些头创建入站消息。

(…)转换器将消息转换为包含所有标头和有效负载的映射,序列化程序将映射序列化为字节[]。

我可以按顺序进行区分吗