Java NIO - Saluran Socket
Saluran soket Java NIO adalah saluran jenis yang dapat dipilih yang berarti dapat dimultipleks menggunakan selektor, digunakan untuk soket penghubung aliran data yang berorientasi aliran. Saluran soket dapat dibuat dengan memanggil statisnya open() metode, menyediakan soket yang sudah ada sebelumnya belum ada Saluran soket dibuat dengan memanggil metode terbuka tetapi belum terhubung Untuk menghubungkan saluran soket connect() Salah satu poin yang akan disebutkan di sini adalah jika saluran tidak terhubung dan operasi I / O apa pun dicoba untuk dicoba, maka NotYetConnectedException dilemparkan oleh saluran ini. Jadi, seseorang harus memastikan bahwa saluran terhubung sebelum melakukan IO apa pun operasi.Setelah saluran terhubung, itu tetap terhubung sampai ditutup. Status saluran soket dapat ditentukan dengan memanggilnya isConnected metode.
Sambungan saluran soket dapat diselesaikan dengan menjalankannya finishConnect() Metode. Apakah operasi koneksi sedang berlangsung atau tidak, dapat ditentukan dengan memanggil metode isConnectionPending. Secara default saluran soket mendukung koneksi non-pemblokiran. Juga mendukung pematian asinkron, yang mirip dengan operasi penutupan asinkron yang ditentukan di kelas Saluran.
Saluran soket aman untuk digunakan oleh beberapa utas bersamaan. Mereka mendukung pembacaan dan penulisan secara bersamaan, meskipun paling banyak satu utas mungkin membaca dan paling banyak satu utas dapat menulis pada waktu tertentu. Metode connect dan finishConnect saling disinkronkan satu sama lain, dan upaya untuk memulai operasi baca atau tulis saat pemanggilan salah satu metode ini sedang berlangsung akan diblokir hingga pemanggilan tersebut selesai.
Metode penting saluran Socket
bind(SocketAddress local) - Metode ini digunakan untuk mengikat saluran soket ke alamat lokal yang disediakan sebagai parameter untuk metode 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() and open((SocketAddress remote) - Metode terbuka digunakan untuk membuka saluran soket tanpa alamat yang ditentukan sementara metode terbuka berparameter saluran terbuka untuk alamat jarak jauh yang ditentukan dan juga menghubungkannya. Metode kemudahan ini bekerja seolah-olah dengan memanggil metode open (), memanggil metode menghubungkan pada hasil saluran soket, melewati jarak jauh, dan kemudian mengembalikan saluran itu.
read(ByteBuffer dst) - Metode ini digunakan untuk membaca data dari buffer yang diberikan melalui saluran soket.
isConnectionPending() - Metode ini memberi tahu apakah operasi koneksi sedang berlangsung di saluran ini atau tidak.
Contoh
Contoh berikut menunjukkan cara mengirim data dari Java NIO SocketChannel.
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