java NIO Server 和 Client简单样例

来源:互联网 发布:windows截屏怎么截图 编辑:程序博客网 时间:2024/05/17 00:59

TimeServer:

package Server;public class TimeServer {public static void main(String[] args) {int port =8080;if(args!=null && args.length>0){try {port = Integer.valueOf(args[0]);} catch (NumberFormatException e) {// TODO: handle exception//采用默认值}}MultiplexerTimeServer timeServer = new MultiplexerTimeServer(port);new Thread(timeServer,"NIO-MultiplexerTimeServer-001").start();}}

MultiplexerTimeServer:

package Server;import java.io.IOException;import java.net.InetSocketAddress;import java.net.Socket;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;public class MultiplexerTimeServer implements Runnable {private Selector selector;private ServerSocketChannel servChannel;private volatile boolean stop;/** * 初始化多路复用器、绑定监听端口 *  * @param port */public MultiplexerTimeServer(int port) {try {selector = Selector.open();servChannel = ServerSocketChannel.open();servChannel.configureBlocking(false);servChannel.socket().bind(new InetSocketAddress(port));servChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("The time server is start in port:" + port);} catch (Exception e) {// TODO: handle exceptione.printStackTrace();System.exit(1);}}public void stop() {this.stop = true;}@Overridepublic void run() {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) {// TODO: handle exceptionif (key != null) {key.cancel();if (key.channel() != null)key.channel().close();}}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}if (selector != null) {try {selector.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}private void handleInput(SelectionKey key) throws IOException {if (key.isValid()) {// 处理新接入的请求消息if (key.isAcceptable()) {ServerSocketChannel ssc = (ServerSocketChannel) key.channel();SocketChannel sc = ssc.accept();sc.configureBlocking(false);sc.register(selector, SelectionKey.OP_READ);}if (key.isReadable()) {SocketChannel sc = (SocketChannel) key.channel();ByteBuffer readBuffer = ByteBuffer.allocate(1024);int readBytes = sc.read(readBuffer);if (readBytes > 0) {readBuffer.flip();byte[] bytes = new byte[readBuffer.remaining()];readBuffer.get(bytes);String body = new String(bytes,"UTF-8");//有BUGSystem.out.println("The time server receive order:" + body);String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new java.util.Date(System.currentTimeMillis()).toString():"BAD ORDER";doWrite(sc,currentTime);}else if(readBytes < 0){key.cancel();sc.close();}else{;//读到0字节,忽略}}}}private void doWrite(SocketChannel channel,String response) throws IOException{if(response!=null && response.trim().length() > 0){byte[] bytes = response.getBytes();ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);writeBuffer.put(bytes);writeBuffer.flip();channel.write(writeBuffer);}}}


TimeClient:

package Client;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class TimeClient {public static void main(String[] args) {int port = 8080;if (args != null && args.length > 0) {try {port = Integer.valueOf(args[0]);} catch (NumberFormatException e) {// TODO: handle exception// 采用默认值}}new Thread(new TimeClientHandle("127.0.0.1",port),"TimeClient-001").start();}}

TimeClientHandle:

package Client;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ClosedChannelException;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.nio.channels.WritableByteChannel;import java.util.Iterator;import java.util.Set;import java.util.logging.Handler;/** *  * @author Administrator *  */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 (Exception e) {// TODO: handle exceptione.printStackTrace();System.exit(1);}}/* *  * @see java.lang.Runnable#run() */@Overridepublic void run() {try {doConnect();} catch (Exception e) {// TODO: handle exceptione.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) {// TODO: handle exceptionif (key != null) {key.cancel();if (key.channel() != null)key.channel().close();}}}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();System.exit(1);}}// 多路复用器关闭后,所有注册在上面的Channel和Pipe等资源都会被自动去注册关闭,// 所以不需要重复释放资源if (selector != null) {try {selector.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}}private void handleInput(SelectionKey key) throws ClosedChannelException,IOException {// TODO Auto-generated method stubif (key.isValid()) {SocketChannel sc = (SocketChannel) key.channel();if (key.isConnectable()) {if (sc.finishConnect()) {sc.register(selector, SelectionKey.OP_READ);doWrite(sc);} elseSystem.exit(1);// 连接失败,进程退出}if (key.isReadable()) {ByteBuffer readBuffer = ByteBuffer.allocate(1024);int readBytes = sc.read(readBuffer);if (readBytes > 0) {readBuffer.flip();byte[] bytes = new byte[readBuffer.remaining()];readBuffer.get(bytes);String body = new String(bytes, "UTF-8");System.out.println("Now is :" + body);this.stop = true;} else if (readBytes < 0) {key.cancel();sc.close();} else {;// 读到0字节,忽略}}}}private void doConnect() throws IOException {// TODO Auto-generated method stubif(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 {// TODO Auto-generated method stubbyte[] req = "QUERY TIME ORDER".getBytes();ByteBuffer writeBuffer = ByteBuffer.allocate(req.length);writeBuffer.put(req);writeBuffer.flip();sc.write(writeBuffer);if(!writeBuffer.hasRemaining()){System.out.println("Send order 2 server succeed.");}}}

0 0