NIO实例

  • 服务端程序
package main;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

/**
 * @author doggy
 *         Created on 15-10-6.
 */
public class Server {
    public static void main(String[] args){
        try{
            //open a selector
            Selector selector = Selector.open();
            //create a serversocketchannel and init
            ServerSocketChannel ssc = ServerSocketChannel.open();
            ssc.socket().bind(new InetSocketAddress(18530));
            //set it to non blocking,only in this way you can register it to a selector
            ssc.configureBlocking(false);
            //register to OP_ACCEPT,means when accpt this channel would add to selectedChannels
            ssc.register(selector, SelectionKey.OP_ACCEPT);
            while(true){
                //blocked if no event coming
                selector.select();
                //get active channel
                Set<SelectionKey> keys = selector.selectedKeys();
                Iterator<SelectionKey> ite = keys.iterator();
                while(ite.hasNext()){
                    try{
                        SelectionKey key = ite.next();
                        //for OP_ACCEPT
                        if(key.isAcceptable()){
                            ServerSocketChannel sscl = (ServerSocketChannel)key.channel();
                            SocketChannel sc = sscl.accept();
                            sc.configureBlocking(false);
                            sc.register(selector,SelectionKey.OP_READ);
                            System.out.println("connected");
                        //for OP_READ
                        }else if(key.isReadable()){
                            System.out.println("begin read");
                            //get channel
                            SocketChannel sc = (SocketChannel)key.channel();
                            ByteBuffer bb = ByteBuffer.allocate(64);
                            //deal with pipe diconnected
                            if(sc.read(bb) < 0){
                                sc.close();
                                //cancel for register and remove it from selectedKeys
                                key.cancel();
                                continue;
                            }
                            int pos = bb.position();
                            bb.flip();
                            byte[] b = new byte[64];
                            bb.get(b,0,pos);
                            String s = new String(b);
                            System.out.println(s);
                            s = "hello "+s;
                            //attach message to key
                            key.attach(s);
                            //registe a write event
                            key.interestOps(SelectionKey.OP_WRITE);
                            System.out.println("end read");
                        //for OP_WRITE
                        }else if(key.isWritable()){
                            System.out.println("begin write");
                            SocketChannel sc = (SocketChannel)key.channel();
                            ByteBuffer bb;
                            //get attach message
                            String s = (String)key.attachment();
                            bb = ByteBuffer.wrap(s.getBytes());
                            sc.write(bb);
                            key.interestOps(SelectionKey.OP_READ);
                            System.out.println("end write");
                        }
                    }catch (Exception e){
                        e.printStackTrace();
                    } finally{
                        //remove it from selectedKey anyway
                        ite.remove();
                    }
                }
            }
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }
}
  • 客户端程序
package main;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author doggy
 *         Created on 15-10-6.
 */
public class Client {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("127.0.0.1",18530);
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        Scanner in = new Scanner(System.in);
        while(true){
            String s = in.nextLine();
            if(s.toLowerCase().equals("eof")){
                socket.close();
                break;
            }
            os.write(s.getBytes());
            byte[] b = new byte[128];
            is.read(b);
            System.out.println(new String(b));
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值