Java NIO - Soket Kanalı
Java NIO soket kanalı seçilebilir tipte bir kanaldır, yani seçici kullanılarak çoklanabilir, akış yönelimli veri akışı bağlantı soketleri için kullanılır. open() yöntem, önceden var olan herhangi bir soketin mevcut olmaması durumunda, soket kanalı açık yöntemi çağırarak oluşturulur ancak henüz bağlanmamıştır. soket kanalını bağlamak için connect() Burada bahsedilmesi gereken bir nokta, eğer kanal bağlı değilse ve herhangi bir I / O işlemi denenmeye çalışılırsa, bu kanal tarafından NotYetConnectedException atılır.Bu nedenle herhangi bir IO gerçekleştirmeden önce kanalın bağlı olduğundan emin olunmalıdır. Kanal bağlandıktan sonra kapanana kadar bağlı kalır. Soket kanalının durumu kanalın durumu çağrılarak belirlenebilir. isConnected yöntem.
Soket kanalının bağlantısı, kendi finishConnect() Bir bağlantı işleminin devam edip etmediği isConnectionPending yöntemini çağırarak belirlenebilir.Varsayılan olarak yuva kanalı, engellemesiz bağlantıyı destekler.Ayrıca, Channel sınıfında belirtilen eşzamansız kapatma işlemine benzer şekilde zaman uyumsuz kapatmayı destekler.
Soket kanalları birden çok eşzamanlı iş parçacığı tarafından kullanım için güvenlidir. Eşzamanlı okuma ve yazmayı desteklerler, ancak en fazla bir iş parçacığı okuyor olabilir ve herhangi bir zamanda en fazla bir ileti dizisi yazıyor olabilir. Connect ve finishConnect yöntemleri karşılıklı olarak birbirleriyle senkronize edilir ve bu yöntemlerden birinin çağrılması devam ederken bir okuma veya yazma işlemini başlatma girişimi, bu çağrı tamamlanana kadar engellenir.
Soket kanalının önemli yöntemleri
bind(SocketAddress local) - Bu yöntem, soket kanalını bu yönteme parametre olarak sağlanan yerel adrese bağlamak için kullanılır.
connect(SocketAddress remote) - Bu yöntem soketi uzak adrese bağlamak için kullanılır.
finishConnect() - Bu yöntem, bir soket kanalı bağlama işlemini bitirmek için kullanılır.
getRemoteAddress() - Bu yöntem, kanal soketinin bağlı olduğu uzak konumun adresini döndürür.
isConnected() - Daha önce de belirtildiği gibi, bu yöntem soket kanalının bağlantı durumunu, yani bağlı olup olmadığını döndürür.
open() and open((SocketAddress remote) - Açık yöntemi, belirtilen uzak adres için parametreleştirilmiş açık yöntem açık kanal açarken, belirtilmemiş bir adres için bir soket kanalı açıkken kullanılır ve ayrıca ona bağlanır.Bu kolaylık yöntemi, open () yöntemini çağırarak, sonuçta connect yöntemini çağırır gibi çalışır. soket kanalı, uzaktan geçirme ve sonra o kanala geri dönme.
read(ByteBuffer dst) - Bu yöntem, verilen arabellekteki verileri soket kanalı üzerinden okumak için kullanılır.
isConnectionPending() - Bu yöntem, bu kanalda bir bağlantı işleminin devam edip etmediğini söyler.
Misal
Aşağıdaki örnek, Java NIO SocketChannel'dan nasıl veri gönderileceğini gösterir.
C: /Test/temp.txt
Hello World!
İstemci: 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();
}
}
Çıktı
İstemciyi çalıştırmak, sunucu başlayana kadar hiçbir şey yazdırmaz.
Sunucu: 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();
}
}
Çıktı
Sunucuyu çalıştırmak aşağıdakileri yazdıracaktır.
Connection Set: /127.0.0.1:49558
File Received