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