2017-09-19 17 views
2

注釈を使用してxml confなしでSpring Integrationを使用してTCPクライアントを実装する必要があります。PythonのTCPサーバは、Springインテグレーションを使用してTCPクライアントにファイルを送信します。

TCPサーバーはファイルを送信する必要があり、それらを処理するためにはSpring Integrationを使用しなければなりません(今のところ)。だから、私は、PythonでTCPサーバーを作るが、これのための重要性はありません。コード:

import socket as s 

host = '' 
port = 2303 

co = s.socket(s.AF_INET, s.SOCK_STREAM) 
co.bind((host, port)) 
co.listen(5) 
print("Server is listening on port {}".format(port)) 

conn, addr = co.accept() 
print('Connected by', addr) 

while True: 
    try: 
     data = conn.recv(1024) 

     if not data: break 

     print("Client Says: " + data) 
     conn.sendall("Server Says:hi") 

    except s.error: 
     print("Error Occured.") 
     break 

print("Closing connection") 
conn.close() 

そして、ここでのクライアントのためには、春の統合を使用してコードです:

import org.apache.log4j.Logger; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.integration.annotation.ServiceActivator; 
import org.springframework.integration.channel.DirectChannel; 
import org.springframework.integration.ip.tcp.TcpInboundGateway; 
import org.springframework.integration.ip.tcp.connection.TcpNetClientConnectionFactory; 
import org.springframework.integration.transformer.ObjectToStringTransformer; 
import org.springframework.messaging.MessageChannel; 


@Configuration 
public class TCPInputChannel { 

    private static final Logger LOGGER = Logger.getLogger(TCPInputChannel.class); 

    @Bean 
    TcpNetClientConnectionFactory clientConnectionFactory() { 
     LOGGER.info("create TcpNetClientConnectionFactory"); 
     TcpNetClientConnectionFactory cf = new TcpNetClientConnectionFactory("localhost", 2303); 
     cf.setSingleUse(false); 
     cf.setSoTimeout(10000); 
     return cf; 
    } 

    @Bean 
    TcpInboundGateway gateway() { 
     LOGGER.info("create TcpInboundGateway"); 
     TcpInboundGateway g = new TcpInboundGateway(); 
     g.setConnectionFactory(clientConnectionFactory()); 
     g.setClientMode(true); 
     g.setRetryInterval(1000); 
     g.setRequestChannel(input()); 
     return g; 
    } 

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

    @ServiceActivator(inputChannel = "input", outputChannel = "respString") 
    ObjectToStringTransformer stringTransformer() { 
     LOGGER.info("create ObjectToStringTransformer"); 
     ObjectToStringTransformer st = new ObjectToStringTransformer(); 
     return st; 
    } 

    @ServiceActivator(inputChannel = "respString") 
    public String receive(String recv) { 
     LOGGER.info("Recv: " + recv); 
     return "echo"; 
    } 

} 

私はそれを実行すると、サーバは接続を行うことができますが、彼はメッセージを送信することができず、クライアントは何も印刷しません。

答えて

2

AbstractConnectionFactory用途:デフォルトでは

/** 
* Reads data in an InputStream to a byte[]; data must be terminated by \r\n 
* (not included in resulting byte[]). 
* Writes a byte[] to an OutputStream and adds \r\n. 
* 
* @author Gary Russell 
* @since 2.0 
*/ 
public class ByteArrayCrLfSerializer extends AbstractPooledBufferByteArraySerializer { 

。したがって、あなたのサーバーは、それが送信するパッケージの最後に\r\nを確実にする必要があります。

またはあなたの目的のために任意の適切なデシリアライザを選択することができます。 https://docs.spring.io/spring-integration/reference/html/ip.html#connection-factories

+0

私はCRLF行区切りを確保するために私のコードをsettedが、彼はホストとの接続が中断されていることを書きます。そして私のクライアントは何のメッセージも受け取らず、私はサーバをオフフェーンするときに例外を持っているだけです。 – user7953086

+0

また、サーバーが '\ r \ n 'で区切られたメッセージを受け取るようにする必要があります。それがクライアントがデフォルトでどのように動作するかです。 –

+0

各パッケージの終わりを設定したい場合は、どのような方法が最適ですか?他のデシリアライザの1つを使用しますか? – user7953086

関連する問題