Connection Failure on Java7 Asynchronous NIO2 Server

I wrote an asynchronous socketserver using java 7 nio2.

Here is the server operator.

public class AsyncJava7Server implements Runnable, CounterProtocol, CounterServer{ private int port = 0; private AsynchronousChannelGroup group; public AsyncJava7Server(int port) throws IOException, InterruptedException, ExecutionException { this.port = port; } public void run() { try { String localhostname = java.net.InetAddress.getLocalHost().getHostName(); group = AsynchronousChannelGroup.withThreadPool( Executors.newCachedThreadPool(new NamedThreadFactory("Channel_Group_Thread"))); // open a server channel and bind to a free address, then accept a connection final AsynchronousServerSocketChannel asyncServerSocketChannel = AsynchronousServerSocketChannel.open(group).bind( new InetSocketAddress(localhostname, port)); asyncServerSocketChannel.accept(null, new CompletionHandler <AsynchronousSocketChannel, Object>() { @Override public void completed(final AsynchronousSocketChannel asyncSocketChannel, Object attachment) { // Invoke simple handle accept code - only takes about 10 milliseconds. handleAccept(asyncSocketChannel); asyncServerSocketChannel.accept(null, this); } @Override public void failed(Throwable exc, Object attachment) { System.out.println("***********" + exc + " statement=" + attachment); } }); 

and here is a snippet of client code that is trying to connect ...

 public class AsyncJava7Client implements CounterProtocol, CounterClientBridge { AsynchronousSocketChannel asyncSocketChannel; private String serverName= null; private int port; private String clientName; public AsyncJava7Client(String clientName, String serverName, int port) throws IOException { this.clientName = clientName; this.serverName = serverName; this.port = port; } private void connectToServer() { Future<Void> connectFuture = null; try { log("Opening client async channel..."); asyncSocketChannel = AsynchronousSocketChannel.open(); // Connecting to server connectFuture = asyncSocketChannel.connect(new InetSocketAddress("Alex-PC", 9999)); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } // open a new socket channel and connect to the server long beginTime = 0; try { // You have two seconds to connect. This will throw exception if server is not there. beginTime = System.currentTimeMillis(); Void connectVoid = connectFuture.get(15, TimeUnit.SECONDS); } catch (Exception ex) { //EXCEPTIONS THROWN HERE AFTER ABOUT 150 CLIENTS long endTime = System.currentTimeMillis(); long timeTaken = endTime - beginTime; log("************* TIME TAKEN=" + timeTaken); ex.printStackTrace(); throw new RuntimeException(ex); } } 

I have a test that runs clients.

  @Test public void testManyClientsAtSametime() throws Exception { int clientsize = 150; ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(clientsize + 1, new NamedThreadFactory("Test_Thread")); AsyncJava7Server asyncJava7Server = startServer(); List<AsyncJava7Client> clients = new ArrayList<AsyncJava7Client>(); List<Future<String>> results = new ArrayList<Future<String>>(); for (int i = 0; i < clientsize; i++) { // Now start a client final AsyncJava7Client client = new AsyncJava7Client("client" + i, InetAddress.getLocalHost().getHostName(), 9999); clients.add(client); } long beginTime = System.currentTimeMillis(); Random random = new Random(); for (final AsyncJava7Client client: clients) { Callable<String> callable = new Callable<String>() { public String call() { ... ... invoke APIs to connect client to server ... return counterValue; } }; long delay = random.nextLong() % 10000; // somewhere between 0 and 10 seconds. Future<String> startClientFuture = executor.schedule(callable, delay, TimeUnit.MILLISECONDS); results.add(startClientFuture); } 

It works super for about 100 clients. At about 140+, I get an exception loading in the client - when it tries to connect. An exception is: java.util.concurrent.ExecutionException: java.io.IOException: the remote computer refused a network connection.

My test is on one laptop running Windows 7. When it explodes, I check TCP connections and there are about 500 - 600 connections there - this is normal. AS I have similar JDK 1.0 java.net socket programs that can handle 4000 TCP connections.

No exceptions or any sly look at the server.

Therefore, I do not understand what might be wrong here. any ideas?

+4
source share
1 answer

Try using the bind form, which takes a lag limit and sets it to a larger number. For instance:

  final AsynchronousServerSocketChannel asyncServerSocketChannel = AsynchronousServerSocketChannel.open(group).bind( new InetSocketAddress(localhostname, port), 1000); 

I do not know what the default win7 implementation limit is, but it can be the cause of failed connections.

+4
source

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


All Articles