2017-09-19 5 views
2

Je dois implémenter un client TCP avec Spring Integration, en utilisant l'annotation, sans xml conf.TCP Server en python envoi de fichiers au client TCP avec intégration Spring

Le serveur TCP doit envoyer des fichiers, et je dois utiliser Spring Integration pour les gérer et les imprimer (pour l'instant). Donc, je fais un serveur TCP avec python, mais il n'y a pas d'importance pour cela. Code:

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() 

Et pour le client est ici le code en utilisant l'intégration du printemps:

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"; 
    } 

} 

Quand je le lance, le serveur peut établir une connexion, mais il ne peut pas envoyer des messages, et le client n'imprime rien.

Répondre

2

Les utilisations 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 { 

Par défaut. Donc, votre serveur devrait assurer \r\n à la fin du paquet qu'il envoie.

Ou vous pouvez sélectionner un désérialiseur approprié à votre objectif: https://docs.spring.io/spring-integration/reference/html/ip.html#connection-factories

+0

Je setted mon code pour assurer le séparateur de ligne CRLF, mais il écrire que la connexion avec l'hôte est interrompue. Et mon client Ne reçois aucun message, il a juste des exceptions quand je change de serveur. – user7953086

+0

Vous devez également vous assurer que le serveur reçoive également les messages délimités par le '\ r \ n'. C'est ainsi que le client fonctionne par défaut. –

+0

Et si je veux configurer la fin de chaque paquet, quel est le meilleur moyen? Utilisez l'un des autres deserializer? – user7953086