【问题标题】:TCP Server in python sending files to TCP Client with Spring integrationpython中的TCP服务器通过Spring集成向TCP客户端发送文件
【发布时间】:2018-02-28 09:52:39
【问题描述】:

我需要实现一个带有 Spring Integration 的 TCP 客户端,使用注释,没有 xml conf。

TCP 服务器必须发送文件,我必须使用 Spring Integration 来处理它们,并打印它们(现在)。所以,我用python制作了一个TCP服务器,但这并不重要。代码:

import socket as s

host = ''
port = 2303

co = s.socket(s.AF_INET, s.SOCK_STREAM)
co.bind((host, port))
co.listen(5)
print("Server is listening on port {}".format(port))

conn, addr = co.accept()
print('Connected by', addr)

while True:
    try:
        data = conn.recv(1024)

        if not data: break

        print("Client Says: " + data)
        conn.sendall("Server Says:hi")

    except s.error:
        print("Error Occured.")
        break

print("Closing connection")
conn.close()

对于客户端,这里是使用 spring 集成的代码:

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.ip.tcp.TcpInboundGateway;
import org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory;
import org.springframework.integration.transformer.ObjectToStringTransformer;
import org.springframework.messaging.MessageChannel;


@Configuration
public class TCPInputChannel {

    private static final Logger LOGGER = Logger.getLogger(TCPInputChannel.class);

    @Bean
    TcpNetClientConnectionFactory clientConnectionFactory() {
        LOGGER.info("create TcpNetClientConnectionFactory");
        TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory("localhost", 2303);
        cf.setSingleUse(false);
        cf.setSoTimeout(10000);
        return cf;
    }

    @Bean
    TcpInboundGateway gateway() {
        LOGGER.info("create TcpInboundGateway");
        TcpInboundGateway g = new TcpInboundGateway();
        g.setConnectionFactory(clientConnectionFactory());
        g.setClientMode(true);
        g.setRetryInterval(1000);
        g.setRequestChannel(input());
        return g;
    }

    @Bean
    public MessageChannel input() {
        return new DirectChannel();
    }

    @ServiceActivator(inputChannel = "input", outputChannel = "respString")
    ObjectToStringTransformer stringTransformer() {
        LOGGER.info("create ObjectToStringTransformer");
        ObjectToStringTransformer st = new ObjectToStringTransformer();
        return st;
    }

    @ServiceActivator(inputChannel = "respString")
    public String receive(String recv) {
        LOGGER.info("Recv: " + recv);
        return "echo";
    }

}

当我运行它时,服务器可以建立连接,但他不能发送消息,并且客户端不打印任何内容。

【问题讨论】:

    标签: java python spring tcp spring-integration


    【解决方案1】:

    AbstractConnectionFactory 使用:

    /**
     * Reads data in an InputStream to a byte[]; data must be terminated by \r\n
     * (not included in resulting byte[]).
     * Writes a byte[] to an OutputStream and adds \r\n.
     *
     * @author Gary Russell
     * @since 2.0
     */
    public class ByteArrayCrLfSerializer extends AbstractPooledBufferByteArraySerializer {
    

    默认情况下。所以,你的服务器应该确保\r\n 在它发送的包的末尾。

    或者您可以为您的目的选择任何合适的解串器: https://docs.spring.io/spring-integration/reference/html/ip.html#connection-factories

    【讨论】:

    • 我设置了我的代码以确保 CRLF 行分隔符,但他写道,与主机的连接被中止。我的客户没有收到任何消息,只是在我关闭服务器时出现异常。
    • 您还应该确保服务器也接收到由\r\n 分隔的消息。这就是客户端默认的工作方式。
    • 如果我想配置每个包的结尾,最好的方法是什么?使用其他解串器之一?
    • 确实如此。您可以选择任何提供的(反)序列化程序,但双方必须同意合同。
    • 好的,如何用spring定制一个?
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2019-01-01
    • 2023-04-03
    • 2014-03-08
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多