Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan klien SocketChannel dalam java

Bagaimana untuk melaksanakan klien SocketChannel dalam java

王林
王林ke hadapan
2023-04-17 22:28:011462semak imbas

1. Langkah

(1) Buat contoh SocketChannel dan konfigurasikannya dalam mod bukan sekatan Hanya dalam contoh SocketChannel, sebarang operasi I/O tidak menyekat.

(2) Gunakan kaedah connect() untuk menyambung ke pelayan dan gunakan gelung sementara untuk mengesan dan melengkapkan sambungan secara berterusan. Anda mesti menggunakan finishConnect() untuk melengkapkan proses sambungan sebelum operasi I/O segera diperlukan.

(3) Gunakan ByteBuffer untuk membaca dan menulis bait Jika SelectableChannel berada dalam mod tidak menyekat, maka operasi I/Onya mungkin membaca dan menulis lebih sedikit bait daripada bait sebenar, atau bahkan tiada. Oleh itu, kami menggunakan pembacaan dan penulisan berterusan dalam satu gelung untuk memastikan pembacaan dan penulisan selesai.

2. Contoh

public class NonBlockingTCPClient {
    public static void main(String[] args) {
        byte[] data = "hello".getBytes();
        SocketChannel channel = null;
        try {
            // 1. open a socket channel
            channel = SocketChannel.open();
            // adjust to be nonblocking
            channel.configureBlocking(false);
            // 2. init connection to server and repeatedly poll with complete
            // connect() and finishConnect() are nonblocking operation, both return immediately
            if (!channel.connect(new InetSocketAddress(InetAddress.getLocalHost(), 8899))) {
                while (!channel.finishConnect()) {
                    System.out.print(".");
                }
            }
 
            System.out.println("Connected to server...");
 
            ByteBuffer writeBuffer = ByteBuffer.wrap(data);
            ByteBuffer readBuffer = ByteBuffer.allocate(data.length);
            int totalBytesReceived = 0;
            int bytesReceived;
            // 3. read and write bytes
            while (totalBytesReceived < data.length) {
                if (writeBuffer.hasRemaining()) {
                    channel.write(writeBuffer);
                }
                if ((bytesReceived = channel.read(readBuffer)) == -1) {
                    throw new SocketException("Connection closed prematurely");
                }
                totalBytesReceived += bytesReceived;
                System.out.print(".");
            }
            System.out.println("Server said: " + new String(readBuffer.array()));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4 .close socket channel
            try {
                if (channel != null) {
                    channel.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan klien SocketChannel dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam