1 Şubat 2018 Perşembe

ServerSocketChannel Sınıfı - TCP Sunucusu

Giriş
Şu satırı dahil ederiz.
import java.nio.channels.ServerSocketChannel;
TCP sunucusudur. TCP istemcisi için SocketChannel sınıfı kullanlır. Bu sınıfın read() metodu yoktur. accept() metodu bir SocketChannel döndürür ve okuma için bu nesne kullanılır.

accept metodu
SocketChannel nesnesi döndürür. 
Örnek
Şöyle yaparız.
SocketChannel channel = server.accept();
Örnek
Şöyle yaparız. Sunucu, soketten veri okuyor
try {
  InetSocketAddress listenAddr =  new InetSocketAddress(9026);
  
  ServerSocketChannel listener = ServerSocketChannel.open();
  ServerSocket serverSocket = listener.socket();
  serverSocket.setReuseAddress(true);
  serverSocket.bind(listenAddr);
  System.out.println("Listening on port : " + listenAddr.toString());
  
  ByteBuffer buffer = ByteBuffer.allocate(4096);
  while(true) {
    SocketChannel socketChannel = listener.accept();
    System.out.println("Accepted : " + socketChannel);
    socketChannel.configureBlocking(true);
    int nread = 0;
    while (nread != -1)  {
      try {
        nread = socketChannel.read(buffer);
      } catch (IOException e) {
        ...
        nread = -1; 
      }
      buffer.rewind();
    }
  }
} catch (IOException e) {
  ...
}
close metodu

Şöyle yaparız.
channel.close();
open metodu
ServerSocketChannel soyut bir sınıf olduğu için open metodu çağırmaya gerek var.

setOption metodu
Windows'ta desteklenmeyen bir sürü seçenek var. Bir açıklama burada

setOption metodu - SO_REUSEPORT
Bu seçenek aynı porta çoklu listener socket takmak için kullanılır. POSIX sistemlerde çalışıyor ancak  
Windows'ta AsyncSocketOptions.SO_REUSEPORT desteklenmiyor. Hata şöyle
java.lang.UnsupportedOperationException: 'SO_REUSEPORT' not supported
Aynı hata Jetty'de de var. Bu seçenek için Microsoft'un açıklaması burada


supportedOptions metodu
Şöyle yaparız
import java.net.SocketOption;
import java.net.StandardSocketOptions;

SocketOption socketOption = StandardSocketOptions.SO_REUSEPORT;
channel.supportedOptions().contains(socketOption);

Hiç yorum yok:

Yorum Gönder