集册 Java实例教程 使用server socket channel创建非阻塞服务器套接字通道

使用server socket channel创建非阻塞服务器套接字通道

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

435
使用ServerSocketChannel创建无阻塞服务器套接字通道

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;
/*
N o w  J a v a  .   c o m 提 供
*/

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.util.Iterator;

import java.util.Set;/*N o w  J a v a  . c o m*/


public class Main {


  public Main() {

    try {

      // Create a nonblocking server socket channel

      ServerSocketChannel sockChannel = ServerSocketChannel.open();

      sockChannel.configureBlocking(false);


      InetSocketAddress server = new InetSocketAddress("localhost", 79);

      ServerSocket socket = sockChannel.socket();

      socket.bind(server);


      Selector selector = Selector.open();

      sockChannel.register(selector, SelectionKey.OP_ACCEPT);


      while (true) {

        // Wait for a connection

        selector.select();


        // Get list of selection keys with pending events

        Set keys = selector.selectedKeys();

        Iterator it = keys.iterator();


        // Handle each key

        while (it.hasNext()) {


          // Get the key and remove it from the iteration

          SelectionKey selKey = (SelectionKey) it.next();


          it.remove();

          if (selKey.isAcceptable()) {


            // Create a socket connection with the client

            ServerSocketChannel selChannel = (ServerSocketChannel) selKey

                .channel();

            ServerSocket selSocket = selChannel.socket();

            Socket connection = selSocket.accept();


            // Handle the finger request

            handleRequest(connection);

            connection.close();

          }

        }

      }

    } catch (IOException ioe) {

      System.out.println(ioe.getMessage());

    }

  }


  private void handleRequest(Socket connection) throws IOException {


    // Set up input and output

    InputStreamReader isr = new InputStreamReader(connection.getInputStream());

    BufferedReader is = new BufferedReader(isr);

    PrintWriter pw = new PrintWriter(new BufferedOutputStream(

        connection.getOutputStream()), false);


    // Output server greeting

    pw.println("Nio Finger Server");

    pw.flush();


    // Handle user input

    String outLine = null;

    String inLine = is.readLine();


    if (inLine.length() > 0) {

      outLine = inLine;

    }

    readPlan(outLine, pw);


    // Clean up

    pw.flush();

    pw.close();

    is.close();

  }


  private void readPlan(String userName, PrintWriter pw) {

    try {

      FileReader file = new FileReader(userName + ".plan");

      BufferedReader buff = new BufferedReader(file);

      
展开阅读全文