[Apache Mina] Client et serveur en meme temps
Salut,
Je veux réaliser une connexion du type
Code:
1 2 3
|
<---------------
Objet1 ----------------> Objet2 |
objet1 envoie a objet2 un message
donc objet1 va appeler la fonction envoieMessage pour le port utilise par IOAacceptor de l'objet 2 (j'envoie aussi le port du serveur(IOAcceptor)de objet1) .
Quand le message arrive a objet1 j'appele dans la methode
Code:
public void messageReceived(IoSession session, Object message)
envoieMessage avec le port du serveur (IOacceptor) de l'objet2 .
Le problème este que l 'envoi ne marche pas dans la fonction envoieMessage
je bloque dans la ligne
Code:
1 2 3
| if (!future.isConnected()) {
return;
} |
Je sais que je peux utiliser session pour transmettre la réponse mais dans le futur objet1 va être connecte avec plusieurs objets et il devras faire la connexion entre tous les objets.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public static void envoieMessage(String message) {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
connector
.setHandler(new MinaClientHandler(
message));
ConnectFuture future = connector.connect(new InetSocketAddress(
"127.0.0.1", PORT));
future.awaitUninterruptibly();
if (!future.isConnected()) {
return;
}
IoSession session = future.getSession();
session.getConfig().setUseReadOperation(true);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("After Writing");
connector.dispose();
} |
Les trois fichiers importants dans l'application:
MinaClient.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
public class MinaClient {
public static void main(String[] args) throws IOException,
InterruptedException {
envoieMessage("c_"+test+"_"+ PORT);
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
acceptor.setHandler(new MinaServerHandlerClient());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(PORT));
}
public static void envoieMessage(String message) {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
connector
.setHandler(new MinaClientHandler(
message));
ConnectFuture future = connector.connect(new InetSocketAddress(
"127.0.0.1", PORT_SERVER));
future.awaitUninterruptibly();
if (!future.isConnected()) {
return;
}
IoSession session = future.getSession();
session.getConfig().setUseReadOperation(true);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("After Writing");
connector.dispose();
}
} |
MinaServer.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public class MinaServer {
private static final int PORT = 10000;
public static void main(String[] args) throws IOException {
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
acceptor.setHandler(new MinaServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(PORT));
}
} |
MinaServerHandler.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
public class MinaServerHandler extends IoHandlerAdapter {
private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());
@Override
public void sessionOpened(IoSession session) {
// set idle time to 10 seconds
session.getConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
session.setAttribute("Values: ");
}
@Override
public void messageReceived(IoSession session, Object message) {
logger.info("Message received in the server..");
logger.info("Message is: " + message.toString());
i
if (message.toString().substring(0, 1).equals("a")){
int PORT_SERVER = Integer.parseInt(message.toString().substring(message.toString().length()-5));
envoieMessage("reponse", PORT_SERVER);
}
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) {
logger.info("Disconnecting the idle.");
// disconnect an idle client
session.close();
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
// close the connection on exceptional situation
session.close();
}
@Override
public void sessionClosed(IoSession session) {
}
public static void emvoieMessage(String message,int PORT_SERVER) {
IoConnector connector = new NioSocketConnector();
connector.getSessionConfig().setReadBufferSize(2048);
connector.getFilterChain().addLast("logger", new LoggingFilter());
connector.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
connector
.setHandler(new MinaClientHandler(
message));
ConnectFuture future = connector.connect(new InetSocketAddress(
"127.0.0.1", PORT_SERVER));
future.awaitUninterruptibly();
if (!future.isConnected()) {
// le probleme este l'application rentre dans cette condition
return;
}
IoSession session = future.getSession();
session.getConfig().setUseReadOperation(true);
session.getCloseFuture().awaitUninterruptibly();
System.out.println("After Writing");
connector.dispose();
}
} |
Merci pour votre patience, et désolé pour ma mauvaise exprimation.