【问题标题】:TCP Socket connection- Unable to read data sent from external client even after serializing through ByteArrayLengthHeaderSerializerTCP Socket 连接 - 即使在通过 ByteArrayLengthHeaderSerializer 序列化后也无法读取从外部客户端发送的数据
【发布时间】:2018-03-15 00:11:44
【问题描述】:

我已经实现了 TCP 套接字服务器,它接受来自客户端的传入 XML 消息。我可以通过 telnet 发送消息。

但是当我尝试通过 python 脚本建立连接并发送消息时,我得到 IOException:CRLF not found before max message length: 2048.所以我添加了 ByteArrayLengthHeaderSerializer 来序列化和反序列化,但现在我得到以下错误.

IOException:消息长度 1014132591 超过最大消息长度:2048

虽然我增加了最大消息长度,但我得到 IOException:Stream closed after 46 of 1014132591

谁能告诉我如何解决这个问题。

final AbstractServerConnectionFactory crLfServer = context.getBean(AbstractServerConnectionFactory.class);
 ByteArrayLengthHeaderSerializer serializer = new ByteArrayLengthHeaderSerializer();
    serializer.setMaxMessageSize(1000 * 1024);
    crLfServer.setSerializer(serializer);
    crLfServer.setDeserializer(serializer);
    
    

我已经使用 Spring Integration 实现了。下面是我的入站适配器的 sn-p

@Bean
public TcpReceivingChannelAdapter inboundAdapter(AbstractServerConnectionFactory connectionFactory) {
    System.out.println("Creating inbound adapter");
    TcpReceivingChannelAdapter inbound = new TcpReceivingChannelAdapter();

    inbound.setConnectionFactory(connectionFactory);
    //inbound.
    inbound.setOutputChannel(fromTcp());
  

    return inbound;
}

【问题讨论】:

  • 您不能在服务器上使用客户端不理解的序列化程序,也不能在服务器上使用依赖于客户端未发送格式的反序列化程序。提高您的最大读取行缓冲区,或使用没有如此低限制的技术。

标签: sockets spring-boot tcp spring-integration


【解决方案1】:

我认为在消息之后在您的脚本中准确发送该 CRLF 可能会更好。这将是要反序列化的消息的确切分隔符。这是上面提到的 Telnet 使用的一种。但是,您需要回到连接工厂配置中的默认解串器。

【讨论】:

  • 但是我的要求有一个客户端,它使用 python 脚本来建立套接字连接,发送 xml 消息,接收确认然后关闭套接字连接。代码对于 telnet 工作正常,但这不是我的要求
  • TCP 是一个流;您需要一些机制来知道消息何时“完成”。 Telnet 使用 CRLF 终止消息。阅读the documentation。您的客户端和服务器必须就流中“消息”的构成达成一致。长度标头序列化程序需要一个包含消息长度的二进制标头。
  • 我已经浏览了文档,我理解你提到的观点。但是我尝试在 python 中编写套接字服务器,即使没有 CRLF,它也会与客户端对话。
  • spring 集成中有没有办法实现接受原始套接字连接而不是 tcp 或 udp 的服务器?
  • Spring Integration 处理消息,而不是流;当然,您可以编写自定义代码以从套接字读取,但您仍然需要知道数据何时“完成”,因为网络可以将其打包;你怎么知道你有 Python 中的全部信息?如果它基于数据,则需要自定义反序列化器。你的最后一个问题不清楚。你是指什么样的“原始套接字”?
猜你喜欢
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
相关资源
最近更新 更多