Java NIO - Datagram Channel
Java NIO Datagram ใช้เป็นช่องทางที่สามารถส่งและรับแพ็กเก็ต UDP ผ่านโปรโตคอลที่เชื่อมต่อน้อยลงโดยค่าเริ่มต้นช่องทางดาต้าแกรมจะปิดกั้นในขณะที่สามารถใช้ในโหมดที่ไม่ปิดกั้นเพื่อที่จะทำให้ไม่ปิดกั้นเราสามารถใช้การกำหนดค่าการบล็อก ( false) ช่องทาง DataGram สามารถเปิดได้โดยเรียกหนึ่งในวิธีการแบบคงที่ที่มีชื่อว่า open() ซึ่งสามารถใช้ที่อยู่ IP เป็นพารามิเตอร์เพื่อให้สามารถใช้สำหรับการหล่อหลายตัว
ช่องดาต้าแกรมเหมือนกันของ FileChannel ไม่ได้เชื่อมต่อตามค่าเริ่มต้นเพื่อให้เชื่อมต่อได้เราต้องเรียกวิธีการเชื่อมต่อ () อย่างชัดเจนอย่างไรก็ตามไม่จำเป็นต้องเชื่อมต่อช่องดาตาแกรมเพื่อให้ใช้วิธีการส่งและรับในขณะที่ต้องเชื่อมต่อ เพื่อใช้วิธีการอ่านและเขียนเนื่องจากวิธีการเหล่านั้นไม่ยอมรับหรือส่งคืนที่อยู่ซ็อกเก็ต
เราสามารถตรวจสอบสถานะการเชื่อมต่อของช่องดาตาแกรมได้โดยเรียกมัน isConnected() เมธอดเมื่อเชื่อมต่อแล้วช่องดาตาแกรมจะยังคงเชื่อมต่ออยู่จนกว่าจะถูกตัดการเชื่อมต่อหรือปิดแชนเนลดาต้าแกรมเป็นเธรดที่ปลอดภัยและรองรับมัลติเธรดและการทำงานพร้อมกันพร้อมกัน
วิธีการที่สำคัญของช่องดาต้าแกรม
bind(SocketAddress local) - วิธีนี้ใช้เพื่อผูกซ็อกเก็ตของช่องดาตาแกรมเข้ากับโลคัลแอดเดรสซึ่งระบุไว้เป็นพารามิเตอร์ของเมธอดนี้
connect(SocketAddress remote) - วิธีนี้ใช้เพื่อเชื่อมต่อซ็อกเก็ตกับที่อยู่ระยะไกล
disconnect() - วิธีนี้ใช้เพื่อถอดซ็อกเก็ตไปยังที่อยู่ระยะไกล
getRemoteAddress() - วิธีนี้จะส่งกลับที่อยู่ของตำแหน่งระยะไกลที่เชื่อมต่อซ็อกเก็ตของช่อง
isConnected() - ดังที่กล่าวไปแล้ววิธีนี้จะคืนสถานะการเชื่อมต่อของช่องดาตาแกรมเช่นว่าเชื่อมต่อหรือไม่
open() and open(ProtocolFamily family) - ใช้วิธีการเปิดเพื่อเปิดช่องดาตาแกรมสำหรับที่อยู่เดียวในขณะที่วิธีการเปิดแบบพารามิเตอร์เปิดช่องสำหรับที่อยู่หลายรายการที่แสดงเป็นตระกูลโปรโตคอล
read(ByteBuffer dst) - วิธีนี้ใช้เพื่ออ่านข้อมูลจากบัฟเฟอร์ที่กำหนดผ่านช่องทางดาต้าแกรม
receive(ByteBuffer dst) - วิธีนี้ใช้เพื่อรับดาต้าแกรมผ่านช่องทางนี้
send(ByteBuffer src, SocketAddress target) - วิธีนี้ใช้ในการส่งดาต้าแกรมผ่านช่องทางนี้
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการส่งข้อมูลจาก Java NIO DataGramChannel
เซิร์ฟเวอร์: 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();
}
}
เอาต์พุต
Server Started: localhost/127.0.0.1:8989
ไคลเอนต์: 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();
}
}
เอาต์พุต
การรันไคลเอนต์จะพิมพ์ผลลัพธ์ต่อไปนี้บนเซิร์ฟเวอร์
Server Started: localhost/127.0.0.1:8989
Client at /127.0.0.1:64857 sent: Hello World!