Java NIO问题,大侠们帮忙看下

问题描述

packagecom.laos.server;importjava.io.IOException;importjava.net.InetSocketAddress;importjava.net.ServerSocket;importjava.nio.channels.SelectionKey;importjava.nio.channels.Selector;importjava.nio.channels.ServerSocketChannel;importjava.nio.channels.SocketChannel;importjava.util.Iterator;importjava.util.Set;importcom.laos.core.ReflectionUtils;importcom.laos.core.config.Configurabe;importcom.laos.core.config.DefaultConfigure;importcom.laos.core.pool.ThreadPool;importcom.laos.core.pool.ThreadPoolUtils;importcom.laos.core.rw.Reader;importcom.laos.core.rw.Writer;/***socketserver,采用非阻塞方式**@authorshuzt**/publicclassNIOServerSocket{privateConfigurabedefaultConfig;privatefinalThreadPoolreader;privatefinalThreadPoolwriter;privatefinalClassreador;privatefinalClasswritor;/***私有构造器**/privateNIOServerSocket(){defaultConfig=newDefaultConfigure();reader=ThreadPoolUtils.getReadThreadPool(defaultConfig);writer=ThreadPoolUtils.getWriteThreadPool(defaultConfig);StringreadClassName=defaultConfig.get("Reader.class");StringwriteClassName=defaultConfig.get("Writer.class");reador=ReflectionUtils.getClass(readClassName);writor=ReflectionUtils.getClass(writeClassName);if(!Reader.class.isAssignableFrom(reador)||!Writer.class.isAssignableFrom(writor)){System.err.print(reador.getName()+"与"+Reader.class.getName()+"非父子类关系");System.err.println("或"+writor.getName()+"与"+Writer.class.getName()+"非父子类关系");System.exit(-1);}}/***实例*/privatestaticfinalNIOServerSocketserver=newNIOServerSocket();/***获取server实例**@return*/publicstaticNIOServerSocketgetInstance(){returnserver;}/***启动socketserver**@throwsIOException*@throwsNumberFormatException**/publicvoidstart()throwsNumberFormatException,IOException{//获取端口Stringport=defaultConfig.get("server.socket.port");run(Integer.parseInt(port));}privatevoidrun(intport)throwsIOException{ServerSocketChannelchannle=ServerSocketChannel.open();//设置阻塞方式channle.configureBlocking(Boolean.parseBoolean(defaultConfig.get("server.socket.blocking")));Selectorselector=Selector.open();channle.register(selector,SelectionKey.OP_ACCEPT);ServerSocketserver=channle.socket();server.setReceiveBufferSize(Integer.parseInt(defaultConfig.get("server.socket.receiveBufferSize")));server.setReuseAddress(Boolean.parseBoolean(defaultConfig.get("server.socket.reuseAddress")));InetSocketAddressaddr=newInetSocketAddress(port);server.bind(addr);Class[]paraType={Selector.class,SocketChannel.class};while(!Thread.interrupted()){intacceptNum=selector.select();System.out.println("acceptNum===="+acceptNum);if(acceptNum>0){Setkeys=selector.selectedKeys();System.out.println("selectedKeys===="+keys.size());Iteratoritr=keys.iterator();while(itr.hasNext()){SelectionKeyselectKey=(SelectionKey)itr.next();if(selectKey.isAcceptable()){//连接ServerSocketChannelchannel=(ServerSocketChannel)selectKey.channel();SocketChannelsocket=channel.accept();socket.configureBlocking(false);socket.register(selector,SelectionKey.OP_READ);}elseif(selectKey.isReadable()){//读操作SocketChannelchannel=(SocketChannel)selectKey.channel();Object[]parameter={selector,channel};Objectreadclass;try{readclass=ReflectionUtils.newInstanceByConstructor(reador,paraType,parameter);reader.submit((Reader)readclass);}catch(Exceptione){e.printStackTrace();}System.out.println("OP_READ");}elseif(selectKey.isWritable()){//写操作System.out.println("OP_WRITE");SocketChannelchannel=(SocketChannel)selectKey.channel();Object[]parameter={selector,channel};Objectwriteclass;try{writeclass=ReflectionUtils.newInstanceByConstructor(writor,paraType,parameter);writer.submit((Writer)writeclass);}catch(Exceptione){e.printStackTrace();}}selectKey.cancel();itr.remove();}keys.clear();}}}publicstaticvoidmain(String[]args){try{NIOServerSocket.getInstance().start();}catch(IOExceptione){}}}packagecom.laos.core.rw.impl;importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.channels.SelectionKey;importjava.nio.channels.Selector;importjava.nio.channels.SocketChannel;importjava.util.Calendar;importcom.laos.core.rw.Reader;/***默认读写操作*@authorshuzt**/publicclassDefaultReaderextendsReader{publicDefaultReader(Selectorselector,SocketChannelchannal){super(selector,channal);}@Overrideprotectedvoidread(Selectorselector,SocketChannelchannal){ByteBufferbuffer=ByteBuffer.allocate(1024);try{channal.read(buffer);System.out.println(Calendar.getInstance().getTime()+"DefaultReader");channal.register(selector,SelectionKey.OP_WRITE);System.out.println("finishreadoperation");}catch(IOExceptione){e.printStackTrace();}}}程序走到//读操作之后就不动了,按理说我在read操作后将socketchannle注册为write就会继续往下走啊?

时间: 2024-11-01 20:28:09

Java NIO问题,大侠们帮忙看下的相关文章

java-请熟悉Java swing的大神帮忙看下这是什么控件

问题描述 请熟悉Java swing的大神帮忙看下这是什么控件 就是常见的这种提示框,Java有没有这种控件?叫什么名字? 解决方案 这是用JComponent的一个方法实现的,方法名为public void setToolTipText(String text) 例如我最近用给 JLabel添加提示语, 代码如下: JLabel lbl_setOutput = new JLabel(); ...... lbl_setOutput.setToolTipText("修改输出目录"); 效

软件开发-JAVA在下载的时候报错,各位大神路过顺便帮忙看下吧

问题描述 JAVA在下载的时候报错,各位大神路过顺便帮忙看下吧 ClientAbortException: java.io.IOException at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:368) at org.apache.catalina.co

各位大神帮忙看下一个JAVA多线程问题

问题描述 各位大神帮忙看下一个JAVA多线程问题 public class ttt { public static void main(String args[]) { account a=new account(); person person1=new person(); person person2=new person(); person1.cunkuanjine=1000; person2.cunkuanjine=2000; person1.zhanghu=a; person2.zha

java多线程问题 求各位大神帮忙看下

问题描述 java多线程问题 求各位大神帮忙看下 就是要创建100个线程,每个线程都对sum值进行加一,如果我注释掉sleep(1);的话就会输出0 没有注释掉就会正常输出1-100请问 这是为什么啊?谢谢. public class test1 { private static int sum=0; private static Object obj=new Object(); public static void main(String[] args) throws InterruptedE

线程-java server端发送数据给客户端出现问题,求高手帮忙看下!

问题描述 java server端发送数据给客户端出现问题,求高手帮忙看下! java server端发送数据给客户端出现问题,求高手帮忙看下! package com.zeph.multiclient; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class MultiThreadServer extends Thread { private Socket client; publ

页面-java web网上书店有个问题 求大神帮忙看下

问题描述 java web网上书店有个问题 求大神帮忙看下 前一个页面一个表单传值, 请输入收货地址: 后面在OrderServlet中处理 其中的数据库中的操作没有问题 但是连到OrderServlet中出现求大神帮忙!!!!! 解决方案 你点击继续看看什么效果啊,如果有问题就贴出来 解决方案二: 没有效果就是停在这个servlet了,而且数据库方法也没有实现 解决方案三: 数据库方法也没有实现

java大神帮忙看下代码越界问题

问题描述 java大神帮忙看下代码越界问题 package com.net.ch02; public class Split { public void func(String str,String s){ String Str = s+str+s; String[]array = new String[100]; int[]ray = new int[100]; for(int i = 1 ; i<=Str.length();i++ ){array[i-1] = Str.substring(i

java 7-求第m个到第n个素数之间的素数和,求帮忙看下哪里错了 提取数组求和的时候总是在数组中出现0

问题描述 求第m个到第n个素数之间的素数和,求帮忙看下哪里错了 提取数组求和的时候总是在数组中出现0 public class All { public static void main(String[] args) { int a[] = new int[200]; //将前200个数中的素数提取出来放入数组a中 for(int i = 1 ; i < 200 ; i ++){ boolean isPrime = true; for(int k = 2 ; k < i ; k ++){ if

jsp-求教:哪位大神帮忙看下代码,本人小白,实在不知道哪里有问题!!

问题描述 求教:哪位大神帮忙看下代码,本人小白,实在不知道哪里有问题!! 代码如下,登陆页面,把java逻辑放到了后台页面上,运行的时候没有报错,但是不跳转.测试账号密码正确不跳转因为没写,但是测试账号密码错误的情况下也不跳转. <%@ page language=""java"" import=""java.util.*java.sql.*info.DataBase"" pageEncoding=""