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.
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
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. –
Et si je veux configurer la fin de chaque paquet, quel est le meilleur moyen? Utilisez l'un des autres deserializer? – user7953086