Gradle: MessageIOException: Failed to write message [EndOfStream] to 127.0.0.1 (firewall)?

I wrote a simple test project that for some time opens port 9123 and exits:

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

This test runs on IntelliJ and when Windows Firewall is turned off.

When Windows Firewall is turned on, it does not work with an 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 

What's happening?

Why is the specified port 58895 very different from the open port 9123 ?

How to perform this test run without disabling the firewall?

Which program to add to the white list of Windows firewalls for this test works fine?

+5
source share
1 answer

This may be due to the way gradle handles System.exit() calls, see GRADLE-2759 .

It is generally a good idea to have a call to System.exit() in tests, since it can go bad with the test infrastructure (what if everything is running from the same JVM? Would you suddenly disconnect it). You must add a way to gracefully shut down the server.

Note that the network error does not seem to have anything to do with your network code or your server: you can see from the package name in the stack trace ( org.gradle.messaging.remote.internal ) that it comes from Gradle. This is why the port is different and not related to the one you specified.

Not sure why this would go with the Windows firewall though.

+3
source

Source: https://habr.com/ru/post/1261060/


All Articles