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
- Java NIO Socket通信
- Java NIO Socket通信
- Java NIO Socket通信
- java NIO Socket通信
- Java NIO Socket通信
- nio socket 异步通信 java
- java NIO socket 通信实例
- java nio学习之 socket+nio 通信
- java socket & java NIO 通信机制
- 基于Java NIO的Socket通信
- Java NIO(异步IO)Socket通信例子
- java nio socket实现多线程多用户通信
- 基于Java NIO的Socket通信
- 基于Java NIO的Socket通信
- java nio socket通信简单入门示例
- 基于Java NIO 的socket通信实例
- 基于Java NIO的Socket通信
- 基于Java NIO的Socket通信
- USACO 1.3-Barn Repair
- 前端框架总结
- Spring + Springmvc + myBatis 简单实例
- SDWebimage的原理和使用机制
- 祝贺老伴找到心仪的工作
- java NIO Socket通信
- USACO 1.3-Combination Lock
- VS2013配置curl
- USACO 1.3-Mixing Milk
- FreeRTOS 源码结构说明
- USACO 1.3-Prime Cryptarithm
- 第三方CocoaAsyncSocket回调方法一览
- 2016-04-04
- C++虚函数和纯虚函数