Java NIO - ซ็อกเก็ตแชนแนล
Java NIO ซ็อกเก็ตแชนเนลเป็นแชนเนลประเภทที่เลือกได้ซึ่งหมายความว่าสามารถมัลติเพล็กซ์โดยใช้ตัวเลือกซึ่งใช้สำหรับซ็อกเก็ตการเชื่อมต่อกระแสข้อมูลที่มุ่งเน้นกระแสข้อมูลซ็อกเก็ตแชนเนลสามารถสร้างได้โดยเรียกใช้สแตติก open() วิธีการจัดเตรียมซ็อกเก็ตที่มีอยู่แล้วยังไม่มีอยู่ช่องซ็อกเก็ตถูกสร้างขึ้นโดยการเรียกใช้วิธีการเปิด แต่ยังไม่ได้เชื่อมต่อเพื่อเชื่อมต่อช่องซ็อกเก็ต connect() จะเรียกวิธีการจุดหนึ่งที่จะกล่าวถึงในที่นี้คือถ้าไม่ได้เชื่อมต่อช่องสัญญาณและพยายามดำเนินการ I / O ใด ๆ แล้ว NotYetConnectedException จะถูกโยนทิ้งโดยช่องนี้ดังนั้นต้องตรวจสอบให้แน่ใจว่าเชื่อมต่อช่องสัญญาณก่อนที่จะดำเนินการ IO ใด ๆ เมื่อเชื่อมต่อช่องแล้วจะยังคงเชื่อมต่อจนกว่าจะปิดสถานะของช่องซ็อกเก็ตอาจถูกกำหนดโดยการเรียกใช้ isConnected วิธี.
การเชื่อมต่อของช่องซ็อกเก็ตสามารถทำได้โดยการเรียกใช้ finishConnect() วิธีการไม่ว่าการดำเนินการเชื่อมต่อกำลังดำเนินการอยู่อาจถูกกำหนดโดยการเรียกใช้เมธอด isConnectionPending โดยดีฟอลต์ซ็อกเก็ตแชนเนลรองรับการเชื่อมต่อแบบไม่ปิดกั้นนอกจากนี้ยังรองรับการปิดแบบอะซิงโครนัสซึ่งคล้ายกับการดำเนินการปิดแบบอะซิงโครนัสที่ระบุในคลาส Channel
ช่องซ็อกเก็ตปลอดภัยสำหรับการใช้งานโดยเธรดหลายเธรดพร้อมกัน สนับสนุนการอ่านและการเขียนพร้อมกันแม้ว่าเธรดส่วนใหญ่อาจกำลังอ่านอยู่และเธรดส่วนใหญ่อาจกำลังเขียนในช่วงเวลาใดเวลาหนึ่ง เมธอด connect และ finishConnect จะซิงโครไนซ์ซึ่งกันและกันและความพยายามที่จะเริ่มการดำเนินการอ่านหรือเขียนในขณะที่กำลังดำเนินการเรียกใช้วิธีใดวิธีหนึ่งเหล่านี้จะบล็อกจนกว่าการเรียกใช้จะเสร็จสมบูรณ์
วิธีการสำคัญของ Socket channel
bind(SocketAddress local) - วิธีนี้ใช้เพื่อผูกช่องซ็อกเก็ตกับโลคัลแอดเดรสซึ่งจัดเตรียมไว้เป็นพารามิเตอร์ของเมธอดนี้
connect(SocketAddress remote) - วิธีนี้ใช้เพื่อเชื่อมต่อซ็อกเก็ตกับที่อยู่ระยะไกล
finishConnect() - วิธีนี้ใช้เพื่อเสร็จสิ้นขั้นตอนการเชื่อมต่อช่องซ็อกเก็ต
getRemoteAddress() - วิธีนี้จะส่งกลับที่อยู่ของตำแหน่งระยะไกลที่เชื่อมต่อซ็อกเก็ตของช่อง
isConnected() - ดังที่ได้กล่าวไปแล้ววิธีนี้จะคืนสถานะการเชื่อมต่อของช่องซ็อกเก็ตเช่นเชื่อมต่อหรือไม่
open() and open((SocketAddress remote) - ใช้วิธีการเปิดเพื่อเปิดช่องซ็อกเก็ตโดยไม่มีที่อยู่ที่ระบุในขณะที่วิธีการเปิดที่กำหนดพารามิเตอร์จะเปิดช่องสำหรับที่อยู่ระยะไกลที่ระบุและเชื่อมต่อด้วยวิธีการอำนวยความสะดวกนี้ทำงานเหมือนกับการเรียกใช้เมธอด open () โดยเรียกใช้วิธีการเชื่อมต่อเมื่อผลลัพธ์ ซ็อกเก็ตช่องส่งผ่านระยะไกลแล้วส่งคืนช่องนั้น
read(ByteBuffer dst) - วิธีนี้ใช้เพื่ออ่านข้อมูลจากบัฟเฟอร์ที่กำหนดผ่านช่องซ็อกเก็ต
isConnectionPending() - วิธีนี้จะบอกว่ากำลังดำเนินการเชื่อมต่ออยู่ในช่องนี้หรือไม่
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการส่งข้อมูลจาก Java NIO SocketChannel
C: /Test/temp.txt
Hello World!
ไคลเอนต์: 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();
}
}
เอาต์พุต
การรันไคลเอนต์จะไม่พิมพ์อะไรเลยจนกว่าเซิร์ฟเวอร์จะเริ่มทำงาน
เซิร์ฟเวอร์: 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();
}
}
เอาต์พุต
การรันเซิร์ฟเวอร์จะพิมพ์สิ่งต่อไปนี้
Connection Set: /127.0.0.1:49558
File Received