Имитация поведения OutputStreamWriter с помощью TcpSendingMessageHandler - PullRequest
0 голосов
/ 14 апреля 2020

Мы использовали следующий фрагмент кода для Tcp-сервера:

try (ServerSocket serverSocket = new ServerSocket(port)) {
    while (true) {
        Socket socket = serverSocket.accept();
        new ServerThread(socket).start();
    }
}

и ServerThread:

private class ServerThread extends Thread {

        private final Socket socket;

        private ServerThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {

            try (final InputStreamReader reader = new InputStreamReader(socket.getInputStream());
                 final OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream())) {

                int bytesRead;
                char[] buffer = new char[1024];

                while ((bytesRead = reader.read(buffer)) != -1){
                    System.out.println(new String(buffer, 0, bytesRead));
                    writer.write(/* some char[] */);
                    writer.flush();
                }

                // ...
                socket.close();

            } catch (IOException exception){
                // ...
                socket.close();
            }
        }
    }

Мы недавно перешли на использование интеграции с Spring:

        @Bean
        public TcpNetServerConnectionFactory connectionFactory() {
            TcpNetServerConnectionFactory factory = new TcpNetServerConnectionFactory(9000);
            ByteArrayRawSerializer serializer = new ByteArrayRawSerializer();
            factory.setDeserializer(serializer);
            factory.setSerializer(serializer);
            return factory;
        }

        @Bean
        public TcpReceivingChannelAdapter channelAdapter(AbstractServerConnectionFactory connectionFactory) {
            TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
            adapter.setConnectionFactory(connectionFactory);
            adapter.setOutputChannel(messageChannel());
            return adapter;
        }

        @Bean
        @ServiceActivator(inputChannel = "outputChannel")
        public TcpSendingMessageHandler messageHandler(AbstractServerConnectionFactory connectionFactory){
            final TcpSendingMessageHandler handler = new TcpSendingMessageHandler();
            handler.setConnectionFactory(connectionFactory());
            return handler;
        }

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

        @Bean
        @Transformer(inputChannel = "messageChannel", outputChannel = "loggingChannel")
        public ObjectToStringTransformer loggingTransformer() {
            return new ObjectToStringTransformer();
        }

        @Bean
        @ServiceActivator(inputChannel = "loggingChannel")
        public void log(String message) {
            System.out.println(message);
        }

с вышеуказанной конфигурацией; мы успешно получаем сообщения и распечатываем их. Когда я получаю доступ к приложению Spring с клиентом Te lnet, я получаю сообщения на терминале, однако клиентское приложение (написанное на C ++ с WinSock2.h) получает тайм-аут. Чем отличается приложение и как имитировать поведение OutputStreamWriter s

writer.write(/* some char[] */);
writer.flush();

с TcpSendingMessageHandler для приложения WinSock2.h?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы читали ByteArrayRawSerializer JavaDocs? Знаете ли вы, что он не закрывает Socket сам по себе, как вы делаете это в своем пользовательском коде после чтения и записи?

Вам, вероятно, следует подумать о закрытии Connection после его использования.

См. Эту опцию на ConnectionFactory:

/**
 * If true, sockets created by this factory will be used once.
 * @param singleUse The singleUse to set.
 */
public void setSingleUse(boolean singleUse) {

Затем TcpSendingMessageHandler закроет его после отправки сообщения в этот OutputStreamWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...