Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan model IO dan Pemilih teknologi asas Java

Bagaimana untuk melaksanakan model IO dan Pemilih teknologi asas Java

WBOY
WBOYasal
2023-11-08 18:00:181120semak imbas

Bagaimana untuk melaksanakan model IO dan Pemilih teknologi asas Java

Melaksanakan model IO dan Pemilih teknologi asas Java

Dalam pengaturcaraan Java, model dan Pemilih IO (Input-Output) adalah teknologi asas yang sangat penting untuk memproses komunikasi rangkaian dan operasi fail dengan cekap. Dalam artikel ini, kami akan menyelidiki prinsip pelaksanaan model IO dan Pemilih dalam Java, dan menyediakan contoh kod khusus untuk membantu pembaca memahami konsep ini dengan lebih baik.

1. Model IO

  1. Menyekat IO
    Model IO yang menyekat ialah model IO yang paling asas. Di bawah model ini, apabila aplikasi memulakan permintaan IO, jika data belum sedia, aplikasi akan disekat sehingga data bersedia untuk meneruskan pelaksanaan. Pelaksanaan model ini sangat mudah, tetapi kurang cekap dalam persekitaran konkurensi tinggi.
  2. IO yang tidak menyekat
    Model IO yang tidak menyekat menyemak kesediaan operasi IO melalui tinjauan pendapat Jika data tidak bersedia, aplikasi boleh kembali serta-merta tanpa disekat. Walau bagaimanapun, model ini memerlukan aplikasi untuk mengundi secara berterusan dan tidak cekap.
  3. Multiplexed IO
    Model IO multiplexed memaklumkan aplikasi kesediaan untuk operasi IO melalui pemberitahuan acara, dan tidak memerlukan aplikasi untuk membuat tinjauan secara aktif. Selector dan SelectableChannel dalam Java adalah berdasarkan model IO berganda.

2. Penggunaan Selector

Selector ialah komponen penting dalam pustaka Java NIO, satu thread boleh menguruskan operasi IO berbilang Saluran. Pemilih menyediakan mekanisme pemultipleksan IO yang cekap yang boleh meningkatkan kecekapan komunikasi rangkaian.

Langkah asas untuk menggunakan Selector adalah seperti berikut:

  1. Buat Selector
    Selector selector = Selector.open();
  2. Create SelectableChannel
    SelectableChannel channel = new SocketChannel();
  3. Selector
    channel daftar( pemilih, SelectionKey.OP_READ);
  4. Pilih acara IO melalui Selector
    int readyChannels = selector.select();
  5. Kendalikan acara IO
    Setselector.selectedKeys(); = selectedKeys .iterator();
    while (keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    if (key.isReadable()) {
    // Kendalikan acara boleh dibaca
    }
    keyIterator.remove( ) ;
    }
Melalui langkah di atas, kita dapat melihat bahawa apabila menggunakan Pemilih, kita perlu mencipta objek terlebih dahulu, kemudian mendaftarkan saluran untuk operasi IO kepada Pemilih, dan kemudian memilih dan memproses peristiwa IO.

Mari kita lihat contoh khusus untuk melaksanakan program komunikasi pelayan dan pelanggan berasaskan Pemilih yang mudah.

Contoh kod pelayan:

public class Server {
  public static void main(String[] args) throws IOException {
    ServerSocketChannel serverSocket = ServerSocketChannel.open();
    serverSocket.socket().bind(new InetSocketAddress(8888));
    serverSocket.configureBlocking(false);

    Selector selector = Selector.open();
    serverSocket.register(selector, SelectionKey.OP_ACCEPT);

    while (true) {
      int readyChannels = selector.select();
      if (readyChannels == 0) continue;

      Set<SelectionKey> selectedKeys = selector.selectedKeys();
      Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
      while (keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        if (key.isAcceptable()) {
          SocketChannel client = serverSocket.accept();
          client.configureBlocking(false);
          client.register(selector, SelectionKey.OP_READ);
          System.out.println("客户端连接:" + client.getRemoteAddress());
        } else if (key.isReadable()) {
          SocketChannel client = (SocketChannel) key.channel();
          ByteBuffer buffer = ByteBuffer.allocate(1024);
          int bytesRead = client.read(buffer);
          while (bytesRead > 0) {
            buffer.flip();
            while (buffer.hasRemaining()) {
              System.out.print((char) buffer.get());
            }
            System.out.println();
            bytesRead = client.read(buffer);
          }
        }
        keyIterator.remove();
      }
    }
  }
}

Contoh kod pelanggan:

public class Client {
  public static void main(String[] args) throws IOException {
    SocketChannel socket = SocketChannel.open();
    socket.configureBlocking(false);
    socket.connect(new InetSocketAddress("localhost", 8888));

    Selector selector = Selector.open();
    socket.register(selector, SelectionKey.OP_CONNECT);

    while (true) {
      int readyChannels = selector.select();
      if (readyChannels == 0) continue;

      Set<SelectionKey> selectedKeys = selector.selectedKeys();
      Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
      while (keyIterator.hasNext()) {
        SelectionKey key = keyIterator.next();
        if (key.isConnectable()) {
          if (socket.finishConnect()) {
            socket.register(selector, SelectionKey.OP_WRITE);
            System.out.println("客户端连接成功");
          }
        } else if (key.isWritable()) {
          ByteBuffer buffer = ByteBuffer.allocate(1024);
          buffer.put("Hello, Server".getBytes());
          buffer.flip();
          while (buffer.hasRemaining()) {
            socket.write(buffer);
          }
          System.out.println("发送数据到服务端");
        }
        keyIterator.remove();
      }
    }
  }
}

Melalui contoh kod di atas, kita boleh melihat cara menggunakan Selector untuk berkomunikasi antara pelayan dan klien. Dalam pelayan, kami mula-mula membuat ServerSocketChannel dan mendaftarkannya pada Pemilih, kemudian pilih acara IO dalam gelung dan mengendalikan permintaan sambungan pelanggan dan membaca data dalam klien, kami mencipta SocketChannel dan mendaftarkannya pada Pemilih, dan kemudian dalam gelung Pilih acara IO dan kendalikan sambungan dan penghantaran data.

Ringkasan

Melalui pengenalan dan contoh kod artikel ini, saya harap pembaca dapat memahami dengan lebih baik prinsip pelaksanaan dan penggunaan model dan Pemilih IO di Jawa. Kajian mendalam dan penguasaan teknologi asas ini adalah penting untuk menulis program komunikasi rangkaian dan operasi fail yang cekap. Perlu diingatkan bahawa dalam pembangunan sebenar, model dan teknologi IO yang sesuai perlu dipilih mengikut keperluan dan senario khusus untuk memenuhi keperluan projek dengan lebih baik.

Semasa proses pembelajaran, pembaca juga boleh mendalami pemahaman dan penguasaan teknologi asas ini dengan membaca bahan yang lebih relevan dan merujuk kepada kes aplikasi yang lebih praktikal. Pada masa yang sama, amalan dan eksperimen berterusan akan membantu pembaca memahami konsep ini dengan lebih mendalam dan dapat mengaplikasikannya dengan mahir untuk pembangunan projek sebenar.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan model IO dan Pemilih teknologi asas Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn