SOA研究(1)-从NIO开始
来源:互联网 发布:金融大数据概念股 编辑:程序博客网 时间:2024/06/05 04:17
最近在看dubbo源码,觉得dubbo还是设计很优秀。有个想法模拟dubbo去写一个SOA框架。编写SOA框架,首先要解决底层传输问题,虽然dubbo默认是用netty传输,但是也是基于NIO。所以我自己写了NIO编程实例,开始研究SOA之路。
实现功能很简单,client发送消息给server,server接收后又发消息给client。
server端:
public class NIOServer extends Thread { private Selector selector; private int port; public NIOServer() { } public NIOServer(int port) throws IOException { this.port = port; } public void run() { System.out.println("服务端线程已经启动!"); try { while (selector.select() > 0) { Set<SelectionKey> selectionKeySet = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectionKeySet.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); try { if (key.isAcceptable()) { doAccept(key); } if (key.isReadable()) { doRead(key); } if (key.isWritable()) { doWrite(key); } } catch (ClosedSelectorException cek) { cek.printStackTrace(); } catch (CancelledKeyException ck) { ck.printStackTrace(); key.cancel(); } catch (Throwable e) { e.printStackTrace(); } } try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } if(selector != null){ selector.close(); } } catch (Throwable e) { e.printStackTrace(); } } private void doAccept(SelectionKey key) throws IOException { System.out.println("accept..."); ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel channel = server.accept(); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_READ); } private void doRead(SelectionKey key) throws IOException { System.out.println("read data from client..."); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); try { while (channel.read(buffer) > 0) { buffer.flip(); System.out.println(getString(buffer)); buffer.clear(); } channel.register(selector, SelectionKey.OP_WRITE); } catch (Throwable e) { e.printStackTrace(); key.cancel(); } } private void doWrite(SelectionKey key) throws IOException { System.out.println("write data to client..."); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.wrap(new String("Hi, client").getBytes("UTF-8")); try { while (buffer.hasRemaining()) { channel.write(buffer); } channel.register(selector, SelectionKey.OP_READ); } catch (Throwable e) { e.printStackTrace(); key.cancel(); } } public void initServer(int port) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(false); serverSocketChannel.bind(new InetSocketAddress(port)); selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); } public void stopServer() throws IOException { if (!selector.isOpen()) { selector.close(); } } public static void main(String[] args) throws IOException { NIOServer server = new NIOServer(); try { server.initServer(8859); server.start(); } catch (Exception e) { e.printStackTrace(); server.stopServer(); } }}
client端:
public class NIOClient extends Thread { private Selector selector; private void initClient(int port) throws IOException { InetSocketAddress address = new InetSocketAddress(port); selector = Selector.open(); SocketChannel channel = SocketChannel.open(); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_CONNECT); channel.connect(address); } public void run() { System.out.println("客户端已经启动!"); try { while (selector.select() > 0) { Set<SelectionKey> keys = selector.selectedKeys(); Iterator<SelectionKey> iterator = keys.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); if (key.isConnectable()) { SocketChannel channel = (SocketChannel) key.channel(); // 如果正在连接,则完成连接 if (channel.isConnectionPending()) { channel.finishConnect(); } channel.register(selector, SelectionKey.OP_WRITE); } if (key.isReadable()) { doRead(key); } if(key.isWritable()){ doWrite(key); } } } } catch (ClosedChannelException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void doRead(SelectionKey key) throws IOException { System.out.println("read data from server..."); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while (channel.read(buffer) > 0) { buffer.flip(); System.out.println(getString(buffer)); buffer.clear(); } channel.register(selector, SelectionKey.OP_WRITE); } private void doWrite(SelectionKey key) throws IOException { System.out.println("write data to server..."); SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.wrap(new String("Hi, server").getBytes("UTF-8")); while (buffer.hasRemaining()) { channel.write(buffer); } channel.register(selector, SelectionKey.OP_READ); } public void stopServer() throws IOException { if (selector != null && selector.isOpen()) { selector.close(); } } public static void main(String[] args) throws IOException, InterruptedException { NIOClient client = new NIOClient(); try { client.initClient(8859); client.start(); } catch (Exception e) { client.stopServer(); } }}
1 0
- SOA研究(1)-从NIO开始
- SOA从面向构件开始
- NIO教程----从ServerBootstrap开始
- 从bpm开始通向soa的康庄大道
- 建设SOA需从企业架构开始
- SOA成功实施需从高层开始
- 建设SOA需从企业架构开始
- SOA实施锦囊:把脉SOA从评估开始
- 研究规划:从现在开始
- 从现在开始专著OpenGIS的研究
- Android 研究之路从这里开始
- 【渲染极限研究】 - 从开始到完结
- CNTK从入门到深入研究(1) - 一切都从介绍和环境搭建开始
- SOA 案例研究:SOA 设计
- XPOSED源码研究之XposedInstaller(1)从manifest开始XposedApp
- SOA可研究方向
- SOA 案例研究(转)
- SOA研究开发
- Fragment常见错误(state丢失)
- Android4.4中WebView无法显示图片解决方案
- linux进程通信--信号量
- import json后,报错:AttributeError: 'module' object has no attribute 'dumps,原因分析及解决方法
- 基于opencv的场景文字识别
- SOA研究(1)-从NIO开始
- python 练习记忆
- 菜鸟的安卓之路。2016.05.31
- 配置PL-SQLDeveloper
- zookeeper 原理
- 如何衡量测试效率
- linux修改用户名
- 浏览器的各自位置和偏移
- 欢迎使用CSDN-markdown编辑器