|
人才网-提供最新的人才网信息,人才信息查询,人才网招聘服务
|
|
|
NIO连接socket |
|
|
早就听说JAVA的NIO比IO牛一些,可是牛在哪里一直都不知道,并且NIO比IO难学,搞了半天终于用NIO弄了两个程序,一个是服务器端,一个是客户端,都是用NIO连接的,代码如下,注释比较少,输出比较多:) /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package testnio; 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.Set; /** * * @author hadeslee */ public class Receive { public static void main(String[] args) throws Exception { boolean b = true; ByteBuffer buffer = ByteBuffer.allocate(1024); ServerSocketChannel ss = ServerSocketChannel.open(); ss.socket().bind(new InetSocketAddress(8888)); ss.configureBlocking(false); Selector se = Selector.open(); ss.register(se, SelectionKey.OP_ACCEPT); while (se.select() > 0) { Set set = se.selectedKeys(); System.out.println("进入一个循环,大小是:" + set.size()); for (SelectionKey key : set) { int ops = key.readyOps(); System.out.println("ops=" + ops); if ((ops & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { SocketChannel sc = ss.accept(); System.err.println("有新的连接了" + sc); System.err.println("地址是:" + sc.socket()); sc.configureBlocking(false); sc.register(se, SelectionKey.OP_READ); } if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) { System.err.println("有新的读取"); SocketChannel sc = (SocketChannel) key.channel(); System.out.println(sc.isConnected()); sc.read(buffer); buffer.flip(); //System.out.println(new String(buffer.array())); Thread.sleep(5000); if (b) { b = false; sc.write(buffer); } } } set.clear(); System.out.println("退出循环"); } } } 客户端: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package testnio; 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.Set; /** * * @author hadeslee */ public class Send { public static void main(String[] args) throws Exception { SocketChannel sc = SocketChannel.open(); ByteBuffer buffer = ByteBuffer.allocate(1024); Selector se = Selector.open(); buffer.put("我是中国人,我爱我的祖国,hadeslee".getBytes()); buffer.flip(); sc.configureBlocking(false); sc.register(se, SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE); sc.connect(new InetSocketAddress("192.168.1.58", 8888)); while(!sc.finishConnect()); sc.write(buffer); System.out.println("进入循环"); Thread.sleep(10000); int sum = se.select(); while (se.select() > 0) { Thread.sleep(100); System.out.println("终于大于0了"); Set set = se.selectedKeys(); System.out.println("大小是:"+set.size()); for (SelectionKey key : set) { int ops = key.readyOps(); if ((ops & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT) { sc.write(buffer); System.out.println("连接成功"); } if ((ops & SelectionKey.OP_READ) == SelectionKey.OP_READ) { System.out.println(" 收到东西"); sc.read(buffer); buffer.flip(); System.out.println("收到的是:" + new String(buffer.array(),0,buffer.limit())); sc.write(buffer); } } se.selectedKeys().clear(); } } private static ByteBuffer[] get(String heads) { ByteBuffer[] bbs = new ByteBuffer[heads.length]; for (int i = 0; i < bbs.length; i++) { String s = heads[i]; bbs[i] = ByteBuffer.allocateDirect(1024); bbs[i].put(s.getBytes()); bbs[i].flip(); } return bbs; } } 有机会再好好研究它们之间的更加具体的用法,以上的只是一个简单的,能互连的一个例子. |
| 人才网http://www.job128.com 信息部 |