集册 Java实例教程 异步客户端套接字通道

异步客户端套接字通道

欢马劈雪     最近更新时间:2020-01-02 10:19:05

492
异步客户端套接字通道

import java.io.BufferedReader;

import java.io.IOException;
/** from 
N o w J a v a . c o m - 时代Java**/

import java.io.InputStreamReader;

import java.net.InetSocketAddress;

import java.net.SocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousSocketChannel;

import java.nio.channels.CompletionHandler;

import java.nio.charset.Charset;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.Future;


class Attachment {

  AsynchronousSocketChannel channel;

  ByteBuffer buffer;/*来自 时 代 J     a    v  a - nowjava.com*/

  Thread mainThread;

  boolean isRead;

}


class ReadWriteHandler implements CompletionHandler<Integer, Attachment> {


  @Override

  public void completed(Integer result, Attachment attach) {

    if (attach.isRead) {

      attach.buffer.flip();

      Charset cs = Charset.forName("UTF-8");


      int limits = attach.buffer.limit();

      byte bytes[] = new byte[limits];

      attach.buffer.get(bytes, 0, limits);

      String msg = new String(bytes, cs);


      System.out.format("Server Responded: %s%n", msg);


      msg = this.getTextFromUser();

      if (msg.equalsIgnoreCase("bye")) {

        attach.mainThread.interrupt();

        return;

      }

      attach.buffer.clear();

      byte[] data = msg.getBytes(cs);

      attach.buffer.put(data);

      attach.buffer.flip();

      attach.isRead = false; // It is a write

      attach.channel.write(attach.buffer, attach, this);

    } else {

      attach.isRead = true;

      attach.buffer.clear();

      attach.channel.read(attach.buffer, attach, this);

    }

  }


  @Override

  public void failed(Throwable e, Attachment attach) {

    e.printStackTrace();

  }


  private String getTextFromUser() {

    System.out.print("Please enter a message (Bye to quit):");

    String msg = null;


    BufferedReader consoleReader = new BufferedReader(new InputStreamReader(

        System.in));

    try {

      msg = consoleReader.readLine();

    } catch (IOException e) {

      e.printStackTrace();

    }


    return msg;

  }

}


public class Main {

  public static void main(String[] args) {

    try (AsynchronousSocketChannel channel = AsynchronousSocketChannel.open()) {

      String serverName = "localhost";

      int serverPort = 5555;

      SocketAddress serverAddr = new InetSocketAddress(serverName, serverPort);

      Future<Void> result = channel.connect(serverAddr);

      System.out.println("Connecting to the server...");

      result.get();

      System.out.println("Connected to the server...");

      Attachment attach = new Attachment();

      attach.channel = channel;

      attach.buffer = ByteBuffer.allocate(2048);

      attach.isRead = false;

      attach.mainThrea
展开阅读全文