2016-12-09 3 views
5

j'ai écrit un projet de test simple, qui ouvre le port 9123 pendant un certain temps et la sortie:Gradle: MessageIOException: Impossible d'écrire le message [EndOfStream] à 127.0.0.1 (Pare-feu)?

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.nio.charset.Charset; 
import java.util.Date; 

import org.apache.mina.core.service.IoAcceptor; 
import org.apache.mina.core.service.IoHandler; 
import org.apache.mina.core.service.IoHandlerAdapter; 
import org.apache.mina.core.session.IdleStatus; 
import org.apache.mina.core.session.IoSession; 
import org.apache.mina.filter.codec.ProtocolCodecFilter; 
import org.apache.mina.filter.codec.textline.TextLineCodecFactory; 
import org.apache.mina.filter.logging.LoggingFilter; 
import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 
public class TimeServer 
{ 
    private static final int PORT = 9123; 
    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 TimeServerHandler()); 
     acceptor.getSessionConfig().setReadBufferSize(2048); 
     acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); 
     acceptor.bind(new InetSocketAddress(PORT)); 
    } 

    private static class TimeServerHandler extends IoHandlerAdapter { 
     @Override 
     public void exceptionCaught(IoSession session, Throwable cause) throws Exception 
     { 
      cause.printStackTrace(); 
     } 
     @Override 
     public void messageReceived(IoSession session, Object message) throws Exception 
     { 
      String str = message.toString(); 
      if(str.trim().equalsIgnoreCase("quit")) { 
       session.close(); 
       return; 
      } 
      Date date = new Date(); 
      session.write(date.toString()); 
      System.out.println("Message written..."); 
     } 
     @Override 
     public void sessionIdle(IoSession session, IdleStatus status) throws Exception 
     { 
      System.out.println("IDLE " + session.getIdleCount(status)); 
     } 
    } 
} 

...

import java.io.IOException; 

public class TimeServerTest { 


    @Test 
    public void runningTimeServerForTime() throws IOException, InterruptedException { 

     int period = 15000; 

     System.out.println("Running time server for " + period + "ms"); 

     TimeServer.main(new String[] {}); 

     Thread.sleep(period); 

     System.out.println("Done, exiting"); 

     System.exit(0); 

    } 
} 

Ce test fonctionne Ok sous IntelliJ et quand le pare-feu Windows est désactivé.

Lorsque le pare-feu Windows est activé, il échoue à l'exception

>gradle test 
:compileJava 
Note: PATH\TimeServer.java uses or overrides a deprecated API. 
Note: Recompile with -Xlint:deprecation for details. 
:processResources UP-TO-DATE 
:classes 
:compileTestJava 
:processTestResources UP-TO-DATE 
:testClasses 
:test 
Unexpected exception thrown. 
org.gradle.messaging.remote.internal.MessageIOException: Could not write message [EndOfStream] to '/127.0.0.1:58895'. 
     at org.gradle.messaging.remote.internal.inet.SocketConnection.dispatch(SocketConnection.java:111) 
     at org.gradle.messaging.remote.internal.hub.MessageHub$ConnectionDispatch.run(MessageHub.java:284) 
     at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
     at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.IOException: An existing connection was forcibly closed by the remote host 
     at sun.nio.ch.SocketDispatcher.write0(Native Method) 
     at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:51) 
     at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) 
     at sun.nio.ch.IOUtil.write(IOUtil.java:51) 
     at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) 
     at org.gradle.messaging.remote.internal.inet.SocketConnection$SocketOutputStream.flush(SocketConnection.java:236) 
     at org.gradle.messaging.remote.internal.inet.SocketConnection.dispatch(SocketConnection.java:109) 
     ... 6 more 

BUILD SUCCESSFUL 

Qu'est-ce qui se passe?

Pourquoi le port référencé 58895 est très différent, que le port ouvert 9123? Comment faire ce test sans désactiver le pare-feu?

Quel programme ajouter à la liste blanche du pare-feu Windows pour ce test s'exécute ok?

+0

De la pile, il n'y a pas de lien vers votre test visible. Si vous ne démarrez pas votre 'TimeServer'. Va-t-il aussi échouer? – SubOptimal

Répondre

2

Il peut être lié à la façon dont gradle gère System.exit() appels, voir GRADLE-2759.

En règle générale, il n'est pas recommandé d'effectuer un test System.exit() car cela risque de perturber le cadre de test (que se passe-t-il si tout est lancé depuis la même JVM? Vous devriez ajouter un moyen d'arrêter votre serveur gracieusement. Notez que l'erreur réseau ne semble pas avoir de lien avec votre code réseau ou votre serveur: vous pouvez voir à partir du nom du paquet dans la trace de la pile (org.gradle.messaging.remote.internal) qu'il provient de Gradle. C'est pourquoi le port est différent et sans rapport avec celui que vous avez spécifié.

Aucune idée de la raison pour laquelle cela ne fonctionnerait pas avec le pare-feu Windows.