java NIO Socket通信

来源:互联网 发布:wav编辑软件中文版 编辑:程序博客网 时间:2024/05/18 01:33

直接上代码
Server 端代码

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;public class NIOServer {    private Selector selector;    public void  initServer(int port) throws IOException{        ServerSocketChannel channel = ServerSocketChannel.open();        channel.configureBlocking(false);        channel.socket().bind(new InetSocketAddress(port));        this.selector = Selector.open();        //注册到selector等待连接        channel.register(selector, SelectionKey.OP_ACCEPT);    }    public void listen() throws IOException{        System.out.println("服务端启动成功");        while(true)        {            selector.select();            Iterator it = this.selector.selectedKeys().iterator();            while(it.hasNext())            {                SelectionKey key = (SelectionKey) it.next();                it.remove();                if(key.isAcceptable())                {                    ServerSocketChannel server = (ServerSocketChannel) key.channel();                    SocketChannel channel = server.accept();                    channel.configureBlocking(false);                    //给客户端发送消息                    channel.write(ByteBuffer.wrap(new String("向客户端发送了一条消息").getBytes()));                    channel.register(selector, SelectionKey.OP_READ);                }                else if(key.isReadable())                {                    read(key);                }            }        }    }    public void read(SelectionKey key) throws IOException{        SocketChannel channel = (SocketChannel) key.channel();          // 创建读取的缓冲区          ByteBuffer buffer = ByteBuffer.allocate(1024);          channel.read(buffer);        byte[] data = buffer.array();          String msg = new String(data).trim();          System.out.println("服务端收到信息:"+msg);        channel.register(selector, SelectionKey.OP_READ);    }    public static void main(String[] args) throws IOException {        NIOServer server = new NIOServer();        server.initServer(9000);        server.listen();    }}

Client端代码

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.util.Iterator;public class NIOClient {    /*     * 客户端     */    private Selector selector;    public void initClinet(String ip, int port) throws IOException    {        //获得一个Socket通道        SocketChannel channel = SocketChannel.open();        //设置通道为非阻塞        channel.configureBlocking(false);        this.selector = Selector.open();        channel.connect(new InetSocketAddress(ip,port));        channel.register(selector, SelectionKey.OP_CONNECT);    }    public void listen() throws IOException{        System.out.println("客户端启动");        while(true)        {            selector.select();            Iterator it = this.selector.selectedKeys().iterator();            while(it.hasNext())            {                SelectionKey key = (SelectionKey) it.next();                it.remove();                if(key.isConnectable())                {                    SocketChannel channel = (SocketChannel) key.channel();                    //如果正在连接 完成连接                    if(channel.isConnectionPending())                    {                        channel.finishConnect();                    }                    channel.configureBlocking(false);                    //给服务端发送消息                    channel.write(ByteBuffer.wrap(new String("向服务端发送一条消息").getBytes()));                    //为了可以接受服务端的消息 需要给通道设置读的权限                    channel.register(this.selector, SelectionKey.OP_READ);                }                else if(key.isReadable())                {                    read(key);                }                else if(key.isWritable())                 {                    write(key);                }            }        }    }    public void write(SelectionKey key){        SocketChannel channel = (SocketChannel) key.channel();         InputStreamReader fis = new InputStreamReader(System.in);        BufferedReader bf = new BufferedReader(fis);        try {            ByteBuffer outBuffer = ByteBuffer.wrap(bf.readLine().getBytes());              channel.write(outBuffer);// 将消息回送给客户端          } catch (Exception e) {        }    }    public void read(SelectionKey key) throws IOException{        SocketChannel channel = (SocketChannel) key.channel();          // 创建读取的缓冲区          ByteBuffer buffer = ByteBuffer.allocate(1024);          channel.read(buffer);          byte[] data = buffer.array();          String msg = new String(data).trim();          System.out.println("客户端收到信息:"+msg);        channel.register(selector,SelectionKey.OP_WRITE);        //ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes());          //channel.write(outBuffer);// 将消息回送给客户端      }    public static void main(String[] args) throws IOException {        NIOClient client = new NIOClient();        client.initClinet("127.0.0.1", 9000);        client.listen();    }}
0 0