2017-01-20 8 views
0

私は春の統合を使用して、カスタマイズされた双方向TCPソケットサーバーを開発しています。spring任意のメッセージングtcpソケット

サーバは、要求/応答タスクを処理しますが、私は多分TcpSendingMessageHandlerTcpReceivingChannelAdapterを使用して知っても

がソリューションです

特定の接続-IDに任意のメッセージを送信することはできませんが、私は見つけることができませんでしたどのようにそれを使用するかに関する任意のサンプルコード。ここ

が私のコードです:ここでは

public class SocketServer { 

    private Logger logger = LoggerFactory.getLogger(SocketServer.class); 

    @Bean 
    public AbstractServerConnectionFactory connectionFactory() { 
     return new TcpNetServerConnectionFactory(2025); 
    } 

    @Bean 
    public TcpInboundGateway TcpInboundGateway(AbstractServerConnectionFactory connectionFactory) { 
     TcpInboundGateway inGate = new TcpInboundGateway(); 
     inGate.setConnectionFactory(connectionFactory); 
     inGate.setRequestChannelName("directChannel"); 
     return inGate; 
    } 

    @Bean 
    public DirectChannel directChannel() { 
     return new DirectChannel(); 
    } 

    @MessageEndpoint 
    public class Echo { 

     @Transformer(inputChannel = "directChannel") 
     public String process(byte[] input) throws Exception { 
      return new String(input).toUpperCase(); 
     } 

    } 

    public boolean sendMessage(String connectionId){ 
      //TODO send Message 
    } 
} 

答えて

1

あなたが行く - 自己説明する必要があります...

@SpringBootApplication 
public class So41760289Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So41760289Application.class, args); 
     Socket socket = SocketFactory.getDefault().createSocket("localhost", 12345); 

     // request/reply 
     socket.getOutputStream().write("foo\r\n".getBytes()); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println(reader.readLine()); 

     // arbitrary send 
     @SuppressWarnings("unchecked") 
     Set<String> connections = context.getBean(Set.class); 
     for (String connection : connections) { 
      context.getBean("bar", MessageChannel.class).send(
        MessageBuilder.withPayload("foo") 
         .setHeader(IpHeaders.CONNECTION_ID, connection) 
         .build()); 
     } 
     System.out.println(reader.readLine()); 
     reader.close(); 
     context.close(); 
    } 

    @Bean 
    public TcpNetServerConnectionFactory cf() { 
     return new TcpNetServerConnectionFactory(12345); 
    } 

    @Bean 
    public TcpReceivingChannelAdapter receiver() { 
     TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter(); 
     adapter.setConnectionFactory(cf()); 
     adapter.setOutputChannelName("foo"); 
     return adapter; 
    } 

    @Transformer(inputChannel = "foo", outputChannel = "bar") 
    public String process(byte[] in) { 
     return new String(in).toUpperCase(); 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "bar") 
    public TcpSendingMessageHandler sender() { 
     TcpSendingMessageHandler handler = new TcpSendingMessageHandler(); 
     handler.setConnectionFactory(cf()); 
     return handler; 
    } 

    @Bean 
    public Set<String> connections() { 
     return Collections.synchronizedSet(new HashSet<>()); 
    } 

    @Bean 
    public ApplicationListener<TcpConnectionEvent> listener() { 
     return new ApplicationListener<TcpConnectionEvent>() { 

      @Override 
      public void onApplicationEvent(TcpConnectionEvent event) { 
       if (event instanceof TcpConnectionOpenEvent) { 
        connections().add(event.getConnectionId()); 
       } 
       else if (event instanceof TcpConnectionCloseEvent) { 
        connections().remove(event.getConnectionId()); 
       } 
      } 

     }; 
    } 

} 
+0

あなたはあなたの応答を要求/応答、任意のメッセージングクライアントを追加することができますか? – Mojtabye

+0

さらに説明できますか? 'main()'メソッドはそれだけを行います。 –