• ServerSocketChannel的使用例子


    1 // ==================== Program Discription =====================
    2 // 程序名称:示例12-14 : SocketChannelDemo.java
    3 // 程序目的:学习Java NIO#SocketChannel
    4 // ==============================================================
    5
    6
    7 import java.nio.ByteBuffer;
    8 import java.nio.channels.ServerSocketChannel;
    9 import java.nio.channels.SocketChannel;
    10 import java.nio.channels.Selector;
    11 import java.nio.channels.SelectionKey;
    12 import java.nio.channels.SelectableChannel;
    13
    14 import java.net.Socket;
    15 import java.net.ServerSocket;
    16 import java.net.InetSocketAddress;
    17 import java.util.Iterator;
    18
    19 public class SocketChannelDemo

    20
    21 {
    22 public static int PORT_NUMBER = 23;//监听端口
    23 ServerSocketChannel serverChannel;
    24 ServerSocket serverSocket ;
    25 Selector selector ;
    26 private ByteBuffer buffer = ByteBuffer.allocateDirect (1024);
    27
    28 public static void main (String [] args)
    29 throws Exception
    30 {
    31 SocketChannelDemo server=new SocketChannelDemo();
    32 server.init(args);
    33 server.startWork();
    34 }
    35
    36
    37 public void init (String [] argv)throws Exception
    38 {
    39 int port = PORT_NUMBER;
    40
    41 if (argv.length > 0) {
    42 port = Integer.parseInt (argv [0]);
    43 }
    44
    45 System.out.println ("Listening on port " + port);
    46
    47 // 分配一个ServerSocketChannel
    48 serverChannel = ServerSocketChannel.open();
    49 // 从ServerSocketChannel里获得一个对应的Socket
    50 serverSocket = serverChannel.socket();
    51 // 生成一个Selector
    52 selector = Selector.open();
    53
    54 // 把Socket绑定到端口上
    55 serverSocket.bind (new InetSocketAddress (port));
    56 //serverChannel为非bolck
    57 serverChannel.configureBlocking (false);
    58
    59 // 通过Selector注册ServerSocetChannel
    60 serverChannel.register (selector, SelectionKey.OP_ACCEPT);
    61
    62 }
    63
    64 public void startWork()throws Exception

    65
    66 {
    67 while (true) {
    68
    69 int n = selector.select();//获得IO准备就绪的channel数量
    70
    71 if (n == 0) {
    72 continue; // 没有channel准备就绪,继续执行
    73 }
    74
    75 // 用一个iterator返回Selector的selectedkeys
    76 Iterator it = selector.selectedKeys().iterator();
    77
    78 // 处理每一个SelectionKey
    79 while (it.hasNext()) {
    80 SelectionKey key = (SelectionKey) it.next();
    81
    82 // 判断是否有新的连接到达
    83 if (key.isAcceptable()) {
    84           //返回SelectionKey的ServerSocketChannel
    85 ServerSocketChannel server =
    (ServerSocketChannel) key.channel();
    86 SocketChannel channel = server.accept();
    87
    88 registerChannel (selector, channel,
    89 SelectionKey.OP_READ);
    90
    91 doWork (channel);
    92 }
    93
    94 // 判断是否有数据在此channel里需要读取
    95 if (key.isReadable()) {
    96
    97 processData (key);
    98
    99 }
    100
    101 //删除 selectedkeys
    102 it.remove();
    103 }
    104 }
    105 }
    106 protected void registerChannel (Selector selector,
    107 SelectableChannel channel, int ops)
    108 throws Exception
    109 {

    110 if (channel == null) {
    111 return;
    112 }
    113
    114
    115 channel.configureBlocking (false);
    116
    117 channel.register (selector, ops);
    118 }
    119
    120 //处理接收的数据
    121 protected void processData (SelectionKey key)
    122 throws Exception
    123 {
    124
    125
    126 SocketChannel socketChannel = (SocketChannel) key.channel();
    127 int count;
    128
    129 buffer.clear(); // 清空buffer
    130
    131 // 读取所有的数据
    132 while ((count = socketChannel.read (buffer)) > 0) {
    133 buffer.flip();
    134
    135 // send the data, don′t assume it goes all at once
    136 while (buffer.hasRemaining())
    137 {
    138 //如果收到回车键,则在返回的字符前增加[echo]$字样
    139 if(buffer.get()==(char)13)
    140 {
    141 buffer.clear();
    142 buffer.put("[echo]___FCKpd___0quot;.getBytes());
    143 buffer.flip();
    144
    145 }
    146 socketChannel.write (buffer);//在Socket里写数据
    147 }
    148
    149 buffer.clear(); // 清空buffer
    150 }
    151
    152 if (count < 0) {
    153 // count<0,说明已经读取完毕
    154 socketChannel.close();

    155 }
    156 }
    157
    158
    159 private void doWork (SocketChannel channel)throws Exception
    160 {
    161 buffer.clear();
    162 buffer.put ("
    Hello,I am working,please input some thing,and i will echo to you!
    [echo]
    ___FCKpd___0quot;.getBytes());
    163 buffer.flip();
    164 channel.write (buffer);
    165 }
    166
    167 }

    比较经典的例子

    http://www.99inf.net/SoftwareDev/Java/52005.htm

  • 相关阅读:
    (面试题)抽象类和静态属性以及静态方法(2019年10月17日)
    抽象类和静态属性以及静态方法(2019年10月17日)
    (面试题)多态(2019年10月16日)
    多态(2019年10月16日)
    (面试题)封装和继承(2019年10月15日)
    封装和继承(2019年10月15日)
    武汉大学2009年数学分析试题解答
    武汉大学2010年数学分析试题解答
    武汉大学2011年数学分析试题解答
    武汉大学2007年数学分析试题解答
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331909.html
Copyright © 2020-2023  润新知