Java NIO通信简单实例

来源:互联网 发布:hebe掰弯selina知乎 编辑:程序博客网 时间:2024/06/04 17:49

此例子使用socketchannel和serversocketchannel,把服务端的一个字符串传递到客户端,并且在客户端输出

客户端:

public class Client01 {SocketChannel client;Selector selector;ByteBuffer buffer;public Client01() throws IOException {client = SocketChannel.open(new InetSocketAddress("127.0.0.1",9800));selector = Selector.open();client.configureBlocking(false);client.register(selector,SelectionKey.OP_READ);buffer = ByteBuffer.allocate(5555);connect();}/* * 连接服务端,并且把传递过来的数据读取到缓冲区 */public void connect() throws IOException {while (true) {if (selector.select()>0) {Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();while (ikeys.hasNext()) {SelectionKey selectionKey = ikeys.next();if (selectionKey.isReadable()) {reads();}ikeys.remove();}}}}public void reads() throws IOException {buffer.clear();client.read(buffer);buffer.flip();System.out.println(new String(buffer.array() ,                  0 , buffer.limit() , "UTF-8"));}public static void main(String[] args) throws IOException {Client01 client01 = new Client01();}}

服务端:

public class Server01 {ServerSocketChannel server;Selector selector;ByteBuffer buffer;/* * 构造函数,初始化各个变量,对ServerSocketChannel进行注册 */public Server01() throws IOException {selector = Selector.open();server = ServerSocketChannel.open();server.configureBlocking(false);//设置为非阻塞模式server.socket().bind(new InetSocketAddress(9800));server.register(selector, SelectionKey.OP_ACCEPT);buffer = ByteBuffer.allocate(25550);openserver();}/* * 此方法把一个字符串传递给客户端 */public void openserver() throws IOException {System.out.println("服务器开启");while (true) {if (selector.select()>0) {Iterator<SelectionKey> ikeys = selector.selectedKeys().iterator();while (ikeys.hasNext()) {SelectionKey selectionKey = ikeys.next();if (selectionKey.isAcceptable()) {ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();SocketChannel socketChannel = serverSocketChannel.accept();send(socketChannel, "7758258");}ikeys.remove();}}}}/* * 传递数据到客户端函数 */public void send(SocketChannel socketChannel,String string) throws IOException {buffer.clear();//清除缓冲区,在使用一系列通道读取或放置 操作填充此缓冲区之前调用此方法buffer.put(string.getBytes());buffer.flip();//反转此缓冲区,在一系列通道读取或放置 操作之后,调用此方法为一系列通道写入或相对获取 操作做好准备socketChannel.write(buffer);}public static void main(String[] args) throws IOException {Server01 server01 = new Server01();}}
0 0