2017-07-16 95 views
1

我被困在寫一個簡單地使用spring-integration接收TCP流消息的服務。我使用這個類來發送測試消息:閱讀TCP流消息

class TCPClient { 
    public static void main(String args[]) throws Exception { 
     Socket clientSocket = new Socket("localhost", 9999); 

     clientSocket.getOutputStream().write("XYZ".getBytes()); 
     clientSocket.close(); 
    } 
} 

服務器代碼,這應該收到一條消息:

@EnableIntegration 
@IntegrationComponentScan 
@Configuration 
public class TcpServer { 

    @Bean 
    public AbstractServerConnectionFactory serverCF() { 
     return new TcpNetServerConnectionFactory(9999); 
    } 

    @Bean 
    public TcpInboundGateway tcpInGate(AbstractServerConnectionFactory conFactory) { 
     TcpInboundGateway inGate = new TcpInboundGateway(); 
     inGate.setConnectionFactory(conFactory); 

     SubscribableChannel channel = new DirectChannel(); 

     //Planning to set custom message handler here, to process messages later 
     channel.subscribe(message -> System.out.println(convertMessage(message))); 

     inGate.setRequestChannel(channel); 
     return inGate; 
    } 

    private String convertMessage(Message<?> message) { 
     return message == null || message.getPayload() == null 
     ? null 
     : new String((byte[]) message.getPayload()); 
    } 
} 

問題:客戶端代碼在運行時 - 服務器記錄以下異常:

TcpNetConnection : Read exception localhost:46924:9999:6d00ac25-b5c8-47ac-9bdd-edb6bc09fe55 IOException:Socket closed during message assembly 

一個很能接受,當我使用的telnet 發送它的消息或當我使用SI簡單的java-only tcp-server實現。我如何配置spring-integration來讀取客戶端發送的消息?

回答

1

默認的反序列化程序期望消息以CRLF(這是Telnet發送的內容以及爲什麼有效)終止。

發送"XYZ\r\n".getBytes()

或者,將解串器更改爲使用接近套接字的ByteArrayRawDeserializer來終止消息。

請參閱the documentation about (de)serializers here

TCP是流媒體協議;這意味着必須爲通過TCP傳輸的數據提供一些結構,因此接收器可以將數據劃分爲離散消息。連接工廠被配置爲使用(de)序列化器在消息負載和通過TCP發送的位之間進行轉換。這是通過分別爲入站和出站消息提供解串器和串行器來完成的。提供了許多標準(德)序列化器。

ByteArrayCrlfSerializer*將字節數組轉換爲字節流,然後是回車符和換行符(\r\n)。這是默認的(反)串行器,例如,可以用telnet作爲客戶端。

...

ByteArrayRawSerializer*,轉換一個字節數組字節流,並增加了沒有附加的消息劃分的數據;使用這個(de)序列化程序,消息的結束由客戶端按順序關閉套接字來指示。使用此串行器時,消息接收將掛起,直到客戶端關閉套接字或發生超時;超時將不會導致消息。