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:
IConnectionHandler.java:
SocketHadler.java:
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:
Código [Seleccionar]
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:
Código [Seleccionar]
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);
}
}