Java NIO Socket编程实例 (2)

客户端

/** * * @param args * @throws IOException */ public static void main(String[] args) throws IOException{ int port = 8080; if(args != null &&args.length >0){ try{ port = Integer.valueOf(args[0]); }catch (NumberFormatException ex){ //采用默认值 } } new Thread(new TimeClientHandle("127.0.0.1",port),"TimeClient-001").start(); } 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.SocketChannel; import java.util.Iterator; import java.util.Set; public class TimeClientHandle implements Runnable{ private String host; private int port; private Selector selector; private SocketChannel socketChannel; private volatile boolean stop; public TimeClientHandle(String host,int port){ this.host = host == null?"127.0.0.1":host; this.port = port; try{ selector = Selector.open(); socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); }catch (IOException e){ e.printStackTrace(); System.exit(1); } } public void run(){ try{ doConnect(); }catch (IOException e){ e.printStackTrace(); System.exit(1); } while(!stop){ try{ selector.select(1000); Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> it = selectionKeys.iterator(); SelectionKey key = null; while(it.hasNext()){ key = it.next(); it.remove(); try{ handleInput(key); }catch (Exception e){ if(key != null){ key.cancel(); if(key.channel() !=null) key.channel().close(); } } } }catch (Exception e){ e.printStackTrace(); System.exit(1); } } if(selector !=null){ try{ selector.close(); }catch (IOException e){ e.printStackTrace(); } } } private void handleInput(SelectionKey key) throws IOException{ if(key.isValid()){ //判断是否连接成功 SocketChannel sc = (SocketChannel)key.channel(); if(key.isConnectable()){ if(sc.finishConnect()){ sc.register(selector,SelectionKey.OP_READ); doWrite(sc); }else{ System.exit(1);//连接失败,进程退出 } } if(key.isReadable()) { ByteBuffer readBuffer = ByteBuffer.allocate(1024); int readBytes = sc.read(readBuffer); if (readBytes > 0) { readBuffer.flip();//将缓冲区当前的limit设置为position,position设置为0 byte[] bytes = new byte[readBuffer.remaining()]; readBuffer.get(bytes); String body = new String(bytes, "UTF-8"); System.out.println("The time server receive order :" + body); this.stop = true; } else if (readBytes < 0) { //对端链路关闭 key.cancel(); sc.close(); } else { //读到0字节,忽略 } } } } private void doConnect() throws IOException{ if(socketChannel.connect(new InetSocketAddress(host,port))){ socketChannel.register(selector,SelectionKey.OP_READ); doWrite(socketChannel); }else{ socketChannel.register(selector,SelectionKey.OP_CONNECT); } } private void doWrite(SocketChannel sc) throws IOException { byte[] bytes = "QUERY TIME ORDER".getBytes(); ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length); writeBuffer.put(bytes); writeBuffer.flip(); sc.write(writeBuffer); if (!writeBuffer.hasRemaining()) System.out.println("Send order 2 server succeed."); } }

先启动服务端,再启动客户端运行实例。

NIO2.0 AIO实例代码

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdgsz.html