上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下...

  1. public class TimeServer {
  2.  
  3. public static void main(String[] args) {
  4. MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400);
  5. new Thread(timersServer, "nio-多路复用器").start();
  6. }
  7.  
  8. }
  1. public class MultipexerTimeServer implements Runnable {
  2.  
  3. private Selector selector;
  4.  
  5. private ServerSocketChannel serverSocketChannel;
  6.  
  7. private volatile boolean stop;
  8.  
  9. public MultipexerTimeServer(String addr,int point){
  10. try {
  11. selector=Selector.open();
  12. serverSocketChannel=ServerSocketChannel.open();
  13. serverSocketChannel.socket().bind(new InetSocketAddress(addr, point));
  14. serverSocketChannel.configureBlocking(false);
  15. serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
  16. System.out.println("socket服务端:"+serverSocketChannel.socket().getInetAddress()+":"+serverSocketChannel.socket().getLocalPort()+"");
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. System.exit(1);
  20. }
  21. }
  22.  
  23. public void stop(){
  24. this.stop=true;
  25. }
  26.  
  27. @Override
  28. public void run() {
  29. while(!stop){
  30. try {
  31. selector.select(1000);
  32. Set<SelectionKey> selectionKeys=selector.selectedKeys();
  33. if(selectionKeys !=null && selectionKeys.size()>0){
  34. Iterator<SelectionKey> it=selectionKeys.iterator();
  35. SelectionKey key=null;
  36. while(it.hasNext()){
  37. key=it.next();
  38. it.remove();
  39. try {
  40. handleInput(key);
  41. } catch (Exception e) {
  42. if(key!=null){
  43. key.cancel();
  44. if(key.channel()!=null){
  45. try {
  46. key.channel().close();
  47. } catch (Exception e1) {
  48. e1.printStackTrace();
  49. }
  50. }
  51. }
  52. }
  53. }
  54. }
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. if(selector!=null){
  60. try {
  61. selector.close();
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67.  
  68. private void handleInput(SelectionKey key) throws IOException{
  69. if(key.isValid()){
  70. //处理新接入的请求
  71. if(key.isAcceptable()){
  72. ServerSocketChannel ssc=(ServerSocketChannel)key.channel();
  73. SocketChannel sc=ssc.accept();
  74. sc.configureBlocking(false);
  75. sc.register(selector,SelectionKey.OP_READ);
  76. SocketAddress clientAddress =sc.getRemoteAddress();
  77. System.out.println("socket链接新客户端:" + clientAddress);
  78. }
  79. if(key.isReadable()){
  80. //读取数据
  81. SocketChannel sc=(SocketChannel)key.channel();
  82. ByteBuffer readBuffer=ByteBuffer.allocate(1024);
  83. int readBytes=sc.read(readBuffer);
  84. if(readBytes>0){
  85. readBuffer.flip();
  86. byte[] bytes=new byte[readBuffer.remaining()];
  87. readBuffer.get(bytes);
  88. String body=new String(bytes, Charset.forName("GBK"));
  89. SocketAddress clientAddress =sc.getRemoteAddress();
  90. System.out.println("socket链接老客户端:" + clientAddress);
  91. System.out.println("服务器接收数据:"+body);
  92. //然后回写点数据给客服端
  93. SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  94. String time=dateFormat.format(new Date());
  95. String res="来自与服务端的回应,时间:"+ time;
  96. doWrite(sc,res);
  97. }else if(readBytes<0){
  98. key.cancel();
  99. sc.close();
  100. }else{
  101. //System.out.println("服务器收到0字节数据...");
  102. }
  103. }
  104. }
  105. }
  106.  
  107. private void doWrite(SocketChannel sc,String res) throws IOException{
  108. if(res!=null && res.trim().length()>0){
  109. byte[] bytes=res.getBytes();
  110. ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
  111. byteBuffer.put(bytes);
  112. byteBuffer.flip();
  113. sc.write(byteBuffer);
  114. }
  115. }

代码不想解释太多,有空整理一下nio的基本概念...

java socket nio编程的更多相关文章

  1. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  2. Java Socket网络编程的经典例子(转)

    事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket ...

  3. java之NIO编程

    所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识. ...

  4. Java Socket NIO入门

    Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...

  5. Java Socket网络编程Server端详解

    Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...

  6. 【Socket】Java Socket基础编程

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  7. Java Socket网络编程学习笔记(一)

    0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...

  8. Java Socket NIO详解(转)

    java选择器(Selector)是用来干嘛的? 2009-01-12 22:21jsptdut | 分类:JAVA相关 | 浏览8901次 如题,不要贴api的,上面的写的我看不懂希望大家能给我个通 ...

  9. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

随机推荐

  1. MySQL的 inner join on 与 left join on

    WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接.INNER JOIN……ON子句产生的连接称为显性连接. inner join:理解为“有效连接”,两张表中都有的数据才会显示left ...

  2. 第七章 探秘Qt的核心机制-信号与槽

    第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...

  3. simple_factory

    #include <stdlib.h> #include <iostream> using namespace std; class Product { public: vir ...

  4. js自运行函数

    学习闭包的基础知识: 函数声明 function fn(){ //这里是代码 }; fn(); //运行fn函数 与上面等价 var fn = function(){ //这里是代码 } fn(); ...

  5. sersync 实时同步工具

    出处:http://code.google.com/p/sersync/ 当前版本的sersync依赖于rsync进行同步.如下图所示,在同步主服务器上开启sersync,将监控路径中的文件同步到目标 ...

  6. php取整的几种方法

    php取整的几种方式. floor 舍去法取整 语法格式:float floor ( float value )返回不大于value 的下一个整数,将value 的小数部分舍去取整.floor() 返 ...

  7. Python 基础篇:介绍

    1. Python 发展 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Cir ...

  8. IIs上MP4、及SVG格式加载失败解决方式

    部署项目是遇到网页播放mp4文件时候,MP4文件不能加载的问题.那是因为IIS上MIME类型中没有添加MP4的格式,添加一下即可. 解决方案: 1.在IIS上选中你的网站,然后点击右边的MIME类型, ...

  9. grunt项目配置

    安装完CLI,还要在项目安装Grunt npm install -g grunt-cli npm install grunt --save-dev 源码放在src下 package.json放在根目录 ...

  10. DB天气app冲刺第十天

    好了 这是第十天了,按照白板任务上的来说的话,今天没有完成,所以等一下还要继续看看今天能不能把他做完,今天出的问题在于我又自己调整了一下UI设计,因为发现以前的设计发面有重复,浪费了屏幕.所以还不如省 ...