java套接字传递_java-spring任意消息传递tcp套接字

我正在使用spring-integration开发定制的双向TCP套接字服务器.

服务器将处理请求/响应任务,但我无法向特定的connection-Id发送任意消息

我也知道也许使用TcpSendingMessageHandler和TcpReceivingChannelAdapter是解决方案,但是我找不到任何有关如何使用它的示例代码.

这是我的代码:

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

}

}

解决方法:

到这里了-应该不言自明…

@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 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 connections() {

return Collections.synchronizedSet(new HashSet<>());

}

@Bean

public ApplicationListener listener() {

return new ApplicationListener() {

@Override

public void onApplicationEvent(TcpConnectionEvent event) {

if (event instanceof TcpConnectionOpenEvent) {

connections().add(event.getConnectionId());

}

else if (event instanceof TcpConnectionCloseEvent) {

connections().remove(event.getConnectionId());

}

}

};

}

}

标签:sockets,tcp,spring,java,spring-integration

来源: https://codeday.me/bug/20191111/2022547.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值