java socket nio编程

上次写了一个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     }
116     

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

时间: 2024-07-31 07:47:56

java socket nio编程的相关文章

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

Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.一般是用来判断对方(设备,进程或其它 网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.基本原因是服务 器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况.

Java Socket网络编程Server端详解

Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网络编程了. 网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系,然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.了解这个简单的模型,就可以

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

事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了. 网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系,然后完成

java之NIO编程

所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义. 本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识.若两文同一篇,那即是两类共享同一文件,其中有一个必为public,若一文在另一文中,即为内部类.按编程规范,还是分成两篇来写为好. java之NIO详解系列文章,比较好的,还是推荐这篇http://tutorials.jenkov.com/java-nio/overview.html.本文只是简略总

Java Socket 多线程编程,处理百万级的数据并发。

感谢网上的大神分享的代码,然后我根据我们项目的需求,组装成余下代码,基本上大概的框架就是这个模式,需要修改的就是业务数据的传递 ,其他的都是不用修改的. 本着学习他人代码,学会他人分享精神,因此将我花了两天研究的代码分享出来(晚上的时间).希望有大神多多指教我这个编程菜鸟的技术,本菜鸟感激不敬. ServerSocket : import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExcepti

Java Socket NIO详解(转)

java选择器(Selector)是用来干嘛的? 2009-01-12 22:21jsptdut | 分类:JAVA相关 | 浏览8901次 如题,不要贴api的,上面的写的我看不懂希望大家能给我个通熟易懂的例子 还有ServerSocketChannel这个类,java.nio这个包里的东西,我看api也不懂- 哎,恼火呀 又是你呵- ssc.register( selector, SelectionKey.OP_ACCEPT ); 这个方法的第二个参数是什么意思呀?还有这个Selection

【Socket】Java Socket基础编程

Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基本示例 二.消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三.服务端优化 3.1 服务端并发处理能力 3.2

java socket 网络编程

一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

Java Socket NIO示例总结

Java NIO是非阻塞IO的实现,基于事件驱动,非常适用于服务器需要维持大量连接,但是数据交换量不大的情况,例如一些即时通信的服务等等,它主要有三个部分组成: Channels Buffers Selectors Channel有两种ServerSocketChannel 和 SocketChannel,ServerSocketChannel可以监听新加入的Socket连接,SocketChannel用于读和写操作.NIO总是把缓冲区的数据写入通道,或者把通道里的数据读出到缓冲区. Buffe