Search code examples
javaspring-boottcpspring-integration

How to create a Tcp Connection in spring boot to accept connections?


I have been through this and understood that I need to create a TcpReceivingChannelAdapter to accept connections. But I don't know how to proceed with that.

Could someone guide me over this?


Solution

  • See the tcp-client-server sample for some pointers using XML configuration.

    For Java configuration; here's a simple Spring Boot app...

    package com.example;
    
    import java.net.Socket;
    
    import javax.net.SocketFactory;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.integration.annotation.Transformer;
    import org.springframework.integration.channel.DirectChannel;
    import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter;
    import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
    import org.springframework.integration.ip.tcp.connection.TcpNetServerConnectionFactory;
    import org.springframework.integration.transformer.ObjectToStringTransformer;
    import org.springframework.messaging.MessageChannel;
    
    @SpringBootApplication
    public class So39290834Application {
    
        public static void main(String[] args) throws Exception {
            ConfigurableApplicationContext context = SpringApplication.run(So39290834Application.class, args);
            Socket socket = SocketFactory.getDefault().createSocket("localhost", 9999);
            socket.getOutputStream().write("foo\r\n".getBytes());
            socket.close();
            Thread.sleep(1000);
            context.close();
        }
    
        @Bean
        public TcpNetServerConnectionFactory cf() {
            return new TcpNetServerConnectionFactory(9999);
        }
    
        @Bean
        public TcpReceivingChannelAdapter inbound(AbstractServerConnectionFactory cf) {
            TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
            adapter.setConnectionFactory(cf);
            adapter.setOutputChannel(tcpIn());
            return adapter;
        }
    
        @Bean
        public MessageChannel tcpIn() {
            return new DirectChannel();
        }
    
        @Transformer(inputChannel = "tcpIn", outputChannel = "serviceChannel")
        @Bean
        public ObjectToStringTransformer transformer() {
            return new ObjectToStringTransformer();
        }
    
        @ServiceActivator(inputChannel = "serviceChannel")
        public void service(String in) {
            System.out.println(in);
        }
    
    }