Java NIO - Kênh Datagram
Java NIO Datagram được sử dụng như một kênh có thể gửi và nhận các gói UDP qua một giao thức ít kết nối hơn. Kênh datagram mặc định bị chặn trong khi nó có thể được sử dụng ở chế độ không chặn. Để không bị chặn, chúng ta có thể sử dụng configBlocking ( false) phương thức. KênhataGram có thể được mở bằng cách gọi một trong các phương thức tĩnh có tên là open() cũng có thể lấy địa chỉ IP làm tham số để nó có thể được sử dụng cho nhiều lần truyền.
Theo mặc định, kênh Datagram của FileChannel không được kết nối để làm cho nó được kết nối, chúng ta phải gọi phương thức connect () của nó một cách rõ ràng. Tuy nhiên, kênh datagram không cần được kết nối để sử dụng các phương thức gửi và nhận trong khi nó phải được kết nối để sử dụng các phương thức đọc và ghi, vì các phương thức đó không chấp nhận hoặc trả về địa chỉ socket.
Chúng ta có thể kiểm tra trạng thái kết nối của kênh datagram bằng cách gọi isConnected() Sau khi được kết nối, một kênh sơ đồ vẫn được kết nối cho đến khi nó bị ngắt kết nối hoặc đóng. Các kênh sơ đồ là luồng an toàn và hỗ trợ đồng thời đa luồng và đồng thời.
Các phương pháp quan trọng của kênh datagram
bind(SocketAddress local) - Phương thức này được sử dụng để liên kết socket của kênh datagram với địa chỉ cục bộ được cung cấp làm tham số cho phương thức này.
connect(SocketAddress remote) - Phương pháp này được sử dụng để kết nối ổ cắm với địa chỉ từ xa.
disconnect() - Phương pháp này được sử dụng để ngắt kết nối ổ cắm với địa chỉ từ xa.
getRemoteAddress() - Phương thức này trả về địa chỉ của vị trí từ xa mà ổ cắm của kênh được kết nối.
isConnected() - Như đã đề cập, phương thức này trả về trạng thái kết nối của kênh datagram tức là nó đã được kết nối hay chưa.
open() and open(ProtocolFamily family) - Phương thức mở được sử dụng để mở một kênh datagram cho một địa chỉ trong khi phương thức mở tham số hóa mở kênh cho nhiều địa chỉ được biểu diễn dưới dạng họ giao thức.
read(ByteBuffer dst) - Phương thức này dùng để đọc dữ liệu từ bộ đệm đã cho thông qua kênh datagram.
receive(ByteBuffer dst) - Phương thức này được sử dụng để nhận datagram qua kênh này.
send(ByteBuffer src, SocketAddress target) - Phương thức này được sử dụng để gửi datagram qua kênh này.
Thí dụ
Ví dụ sau đây cho thấy cách gửi dữ liệu từ Java NIO DataGramChannel.
Máy chủ: DatagramChannelServer.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
public class DatagramChannelServer {
public static void main(String[] args) throws IOException {
DatagramChannel server = DatagramChannel.open();
InetSocketAddress iAdd = new InetSocketAddress("localhost", 8989);
server.bind(iAdd);
System.out.println("Server Started: " + iAdd);
ByteBuffer buffer = ByteBuffer.allocate(1024);
//receive buffer from client.
SocketAddress remoteAdd = server.receive(buffer);
//change mode of buffer
buffer.flip();
int limits = buffer.limit();
byte bytes[] = new byte[limits];
buffer.get(bytes, 0, limits);
String msg = new String(bytes);
System.out.println("Client at " + remoteAdd + " sent: " + msg);
server.send(buffer,remoteAdd);
server.close();
}
}
Đầu ra
Server Started: localhost/127.0.0.1:8989
Khách hàng: DatagramChannelClient.java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
public class DatagramChannelClient {
public static void main(String[] args) throws IOException {
DatagramChannel client = null;
client = DatagramChannel.open();
client.bind(null);
String msg = "Hello World!";
ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes());
InetSocketAddress serverAddress = new InetSocketAddress("localhost",
8989);
client.send(buffer, serverAddress);
buffer.clear();
client.receive(buffer);
buffer.flip();
client.close();
}
}
Đầu ra
Chạy máy khách sẽ in đầu ra sau trên máy chủ.
Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857 sent: Hello World!