Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - BI0N1C

#1
Java / ¿Cómo puede ser que utilize el 100% de CPU?
29 Noviembre 2014, 10:45 AM
Buenas, hace tiempo que ando queriendo desarrollar un sistema asincrónico de sockets en java, pero siempre veía que era una *****, y acababa usando lo típico, como netty o xSockets.

Pero hace días estoy desarrollando un servidor, y quiero que sea totalmente mío (Ya que ahí recibo el pago por ser todo mio), y desarrollé un pequeño sistema, pero este sistema ocupa el 100% de CPU, así que si alguien puede decirme que mejorarle, o que puedo hacer...


SocketListener.java:


import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;


public class SocketListener {
   private IConnectionHandler connectionHandler;
   private AsynchronousServerSocketChannel asyncServerSocketChannel = null;

   public SocketListener() throws Exception {
       this.asyncServerSocketChannel = AsynchronousServerSocketChannel.open();
       this.asyncServerSocketChannel.bind(new InetSocketAddress(FINAL.SOCKET_PORT));
       this.asyncServerSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
           @Override
           public void completed(AsynchronousSocketChannel ch, Object att) {
               asyncServerSocketChannel.accept(null, this);

               handle(ch);
           }
           @Override
           public void failed(Throwable exc, Object attachment) {
               connectionHandler.onException((Exception)exc);
           }
       });
   }

   private void handle(AsynchronousSocketChannel asyncSocketChannel) {
       this.connectionHandler = new SocketHandler();
       this.connectionHandler.onConnect(asyncSocketChannel);
       ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

       try {
           while (asyncSocketChannel.read(byteBuffer).get() != -1) {
               this.connectionHandler.onMessageReceived(byteBuffer.array());
               byteBuffer = ByteBuffer.allocate(1024);
           }
       } catch(Throwable exc){
           this.connectionHandler.onException((Exception)exc);
       }
       this.connectionHandler.onDisconnect(asyncSocketChannel);
       byteBuffer = null;
   }
}



IConnectionHandler.java:
import java.nio.channels.AsynchronousSocketChannel;

public interface IConnectionHandler {
   public void onConnect(AsynchronousSocketChannel asyncSocketChannel);
   public void onDisconnect(AsynchronousSocketChannel asyncSocketChannel);
   public void onMessageReceived(byte[] messageFromClient);
   public void onException(Exception exceptionFromClient);
}



SocketHadler.java:
Citar
import java.nio.channels.AsynchronousSocketChannel;

public class SocketHandler implements IConnectionHandler {

   private AsynchronousSocketChannel asynSocketChannel;

   @Override
   public void onConnect(AsynchronousSocketChannel asynSocketChannel){
       this.asynSocketChannel = asynSocketChannel;
       PartyBang.printWarning(SocketHandler.class, "New Connection Handled!");
   }
   @Override
   public void onDisconnect(AsynchronousSocketChannel asynSocketChannel){
       // dispose all
       this.asynSocketChannel = null;
       PartyBang.printWarning(SocketHandler.class, "Connection Refused!");
   }
   @Override
   public void onMessageReceived(byte[] messageFromClient){
       System.out.println(new String(messageFromClient));
   }
   @Override
   public void onException(Exception exceptionFromClient){
       System.err.println(exceptionFromClient);
   }
}