ホームページ  >  記事  >  Java  >  JavaでSocketChannelクライアントを実装する方法

JavaでSocketChannelクライアントを実装する方法

王林
王林転載
2023-04-17 22:28:011462ブラウズ

1. 手順

(1) SocketChannel インスタンスを作成し、ノンブロッキング モードで設定します SocketChannel インスタンス内でのみ、すべての I/O 操作がノンブロッキングになります。

(2) connect() メソッドを使用してサーバーに接続し、while ループを使用して接続を継続的に検出して完了します。即時 I/O 操作が必要になる前に、finishConnect() を使用して接続プロセスを完了する必要があります。

(3) ByteBuffer を使用してバイトの読み取りおよび書き込みを行います。SelectableChannel がノンブロッキング モードの場合、その I/O 操作で実際のバイトより少ないバイト数が読み書きされるか、まったく読み書きされない場合があります。したがって、読み取りと書き込みが確実に完了するように、ループ内で連続的な読み取りと書き込みを使用します。

2.例

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();
            }
        }
    }
}

以上がJavaでSocketChannelクライアントを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。