Java NIO - Saluran ServerSocket

Saluran soket server Java NIO juga merupakan saluran jenis yang dapat dipilih yang digunakan untuk soket penghubung aliran data berorientasi aliran. Saluran Soket Server dapat dibuat dengan memanggil statis open() metode, menyediakan soket yang sudah ada sebelumnya belum ada.Server Socket channel dibuat dengan memanggil metode terbuka tetapi belum terikat Untuk mengikat saluran soket bind() metode yang akan dipanggil.

Satu hal yang perlu disebutkan di sini adalah jika saluran tidak terikat dan operasi I / O apa pun dicoba untuk dicoba, maka NotYetBoundException dilempar oleh saluran ini. Jadi, seseorang harus memastikan bahwa saluran tersebut dibatasi sebelum melakukan operasi IO.

Koneksi masuk untuk saluran soket server mendengarkan dengan memanggil metode ServerSocketChannel.accept (). Ketika metode accept () kembali, ia mengembalikan SocketChannel dengan koneksi masuk. Dengan demikian, metode accept () memblokir hingga koneksi masuk tiba. Jika saluran dalam mode non-blocking maka metode accept akan segera mengembalikan null jika tidak ada koneksi yang tertunda. Jika tidak, itu akan memblokir tanpa batas hingga koneksi baru tersedia atau kesalahan I / O terjadi.

Soket saluran baru awalnya tidak terikat; itu harus terikat ke alamat tertentu melalui salah satu metode mengikat soketnya sebelum koneksi dapat diterima. Juga saluran baru dibuat dengan memanggil metode openServerSocketChannel dari objek SelectorProvider default di seluruh sistem.

Seperti saluran soket server saluran soket dapat membaca data menggunakan read()metode. Pertama buffer dialokasikan. Data yang dibaca dari ServerSocketChannel disimpan ke dalam buffer. Kedua, kita memanggil metode ServerSocketChannel.read () dan membaca data dari ServerSocketChannel ke dalam buffer. Nilai integer dari metode read () mengembalikan berapa banyak byte yang ditulis ke dalam buffer

Demikian pula data dapat ditulis ke saluran soket server menggunakan write() metode menggunakan buffer sebagai parameter. Biasanya menggunakan metode tulis dalam loop sementara karena perlu mengulangi metode write () sampai Buffer tidak memiliki byte lagi yang tersedia untuk ditulis.

Metode penting saluran Socket

  • bind(SocketAddress local) - Metode ini digunakan untuk mengikat saluran soket ke alamat lokal yang disediakan sebagai parameter untuk metode ini.

  • accept() - Metode ini digunakan untuk menerima koneksi yang dibuat ke soket saluran ini.

  • connect(SocketAddress remote) - Metode ini digunakan untuk menghubungkan soket ke alamat jarak jauh.

  • finishConnect() - Metode ini digunakan untuk menyelesaikan proses menghubungkan saluran soket.

  • getRemoteAddress() - Metode ini mengembalikan alamat lokasi jarak jauh di mana soket saluran terhubung.

  • isConnected() - Seperti yang telah disebutkan, metode ini mengembalikan status koneksi saluran soket, yaitu apakah itu terhubung atau tidak.

  • open() - Metode terbuka digunakan untuk membuka saluran soket tanpa alamat yang ditentukan. Metode praktis ini bekerja seolah-olah dengan memanggil metode open (), menjalankan metode koneksi pada saluran soket server yang dihasilkan, meneruskannya dari jarak jauh, dan kemudian mengembalikan saluran itu.

  • read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran soket.

  • setOption(SocketOption<T> name, T value) - Metode ini menetapkan nilai opsi soket.

  • socket() - Metode ini mengambil soket server yang terkait dengan saluran ini.

  • validOps() - Metode ini mengembalikan satu set operasi yang mengidentifikasi operasi yang didukung saluran ini. Saluran soket server hanya mendukung penerimaan koneksi baru, jadi metode ini mengembalikan SelectionKey.OP_ACCEPT.

Contoh

Contoh berikut menunjukkan cara mengirim data dari Java NIO ServerSocketChannel.

C: /Test/temp.txt

Hello World!

Klien: SocketChannelClient.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.EnumSet;

public class SocketChannelClient {
   public static void main(String[] args) throws IOException {
      ServerSocketChannel serverSocket = null;
      SocketChannel client = null;
      serverSocket = ServerSocketChannel.open();
      serverSocket.socket().bind(new InetSocketAddress(9000));
      client = serverSocket.accept();
      System.out.println("Connection Set:  " + client.getRemoteAddress());
      Path path = Paths.get("C:/Test/temp1.txt");
      FileChannel fileChannel = FileChannel.open(path, 
         EnumSet.of(StandardOpenOption.CREATE, 
            StandardOpenOption.TRUNCATE_EXISTING,
            StandardOpenOption.WRITE)
         );      
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(client.read(buffer) > 0) {
         buffer.flip();
         fileChannel.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Received");
      client.close();
   }
}

Keluaran

Menjalankan klien tidak akan mencetak apa pun sampai server dimulai.

Server: SocketChannelServer.java

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;

public class SocketChannelServer {
   public static void main(String[] args) throws IOException {
      SocketChannel server = SocketChannel.open();
      SocketAddress socketAddr = new InetSocketAddress("localhost", 9000);
      server.connect(socketAddr);
      Path path = Paths.get("C:/Test/temp.txt");
      FileChannel fileChannel = FileChannel.open(path);
      ByteBuffer buffer = ByteBuffer.allocate(1024);
      while(fileChannel.read(buffer) > 0) {
         buffer.flip();
         server.write(buffer);
         buffer.clear();
      }
      fileChannel.close();
      System.out.println("File Sent");
      server.close();
   }
}

Keluaran

Menjalankan server akan mencetak yang berikut ini.

Connection Set:  /127.0.0.1:49558
File Received