Sockets com NIO

Hey Galerinha /o/

Alguem por ai ja usou Sockets com NIO?
Quero implementar algo para aprender mas não estou achando exemplos na rede.

Use algo pronto, porque é bastante difícil.

http://mina.apache.org/

Para as alternativas ao Apache Mina:

http://mina.apache.org/related-projects.html

Poxa cara, não pode ser assim “Tenta algo pronto por que é dificil”. O lance é tentar para aprender :thumbup:

Oque eu estava com dificuldades de descobrir era como usava o ByteBuffer que eu nunca tinha visto na vida, mas na verdade é algo bem bobo.

Rodei o codigo e fiz algumas requisições HTTP nele e aparentemente rodou tudo muito bem.

Oque eu achei mais apropriado usando nio é que eu não tive que lidar com nenhuma exception.

package main;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class Main {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		ServerSocketChannel ssc = ServerSocketChannel.open();
		ServerSocket socket = ssc.socket();
		InetSocketAddress isa = new InetSocketAddress(9090);
		socket.bind(isa);
		int read;
		ByteBuffer readBuffer = ByteBuffer.allocate(128);

		while (true) {
			SocketChannel channel = ssc.accept();

			while (channel.isOpen() && (read = channel.read(readBuffer)) > 0) {

				byte[] bytes = readBuffer.array();
				readBuffer.clear();
				for (int c1 = 0; c1 < read; c1++) {
					System.out.print((char) bytes[c1]);
				}

			}

			ByteBuffer writeBuffer = ByteBuffer.wrap("200".getBytes());

			channel.write(writeBuffer);

			channel.close();
		}
	}
}

Do jeito que você fez, é um servidor que atende a um cliente apenas de cada vez; NIO só é vantajoso quando você aprende a usar operações “non-blocking” (usualmente com algum thread pool) usando menos threads que o método normal de usar uma thread para cada cliente.