下面大家看这个程序import java.nio.channels.*;
import java.nio.charset.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.nio.*;
public class FileServer
{
private int port =8050;
private ServerSocketChannel serverSocketChannel;
private Charset charset=Charset.forName("GBK");
private Selector selector=null;

public  FileServer()throws IOException
{
selector=Selector.open();
serverSocketChannel=ServerSocketChannel.open();
serverSocketChannel.socket().setReuseAddress(true);
serverSocketChannel.socket().bind(new InetSocketAddress(port));

System.out.println("服务器启动");
}
/*编码过程*/
public ByteBuffer encode(String str)
{
return charset.encode(str);
}
/*解码过程*/
public String decode(ByteBuffer bb)
{
return charset.decode(bb).toString();
}
/*服务器服务方法*/
public void service()throws IOException
{
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);
/**外循环,已经发生了SelectionKey数目*/
while(selector.select()>0)
{
/*得到已经被捕获了的SelectionKey的集合*/
Iterator iterator =selector.selectedKeys().iterator();
while(iterator.hasNext())
{
SelectionKey key=null;
try
{
key=(SelectionKey)iterator.next();
iterator.remove();
if(key.isAcceptable())
{
ServerSocketChannel  ssc=(ServerSocketChannel)key.channel();
SocketChannel sc=ssc.accept();
System.out.println("客户端机子的地址是 "+sc.socket().getLocalAddress()+"  客户端机机子的端口号是 "+
sc.socket().getLocalPort());
sc.configureBlocking(false);
ByteBuffer buffer=ByteBuffer.allocate(1024);
sc.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE,buffer);
}
if(key.isReadable()) 
{
reveice(key);
}
if(key.isWritable())
{
send(key);
}
}
catch(IOException e)
{
e.printStackTrace();
try
{
if(key!=null)
{
key.cancel();
key.channel().close();
}
}
catch(ClosedChannelException cex)
{
e.printStackTrace();
}
}
}
/*内循环完*/
}
/*外循环完*/
}
/*service方法完*/



public void reveice(SelectionKey key)throws IOException
{
if(key==null)return;
ByteBuffer buff=(ByteBuffer)key.attachment();
SocketChannel sc=(SocketChannel)key.channel();
buff.limit(buff.capacity());
buff.position(0);
sc.read(buff);
buff.flip();
String reviceData=decode(buff);
}
/*发送文件*/
public void send(SelectionKey key)
{
if(key==null)return;
ByteBuffer buff=(ByteBuffer)key.attachment();
SocketChannel sc=(SocketChannel)key.channel();
String data=decode(buff);
if(data.indexOf("get")==-1)return;
String subStr=data.substring(data.indexOf(" "),data.length());
System.out.println("截取之后的字符串是 "+subStr);
FileInputStream fileInput=null;
try
{
    fileInput=new FileInputStream(subStr);
   FileChannel fileChannel=fileInput.getChannel();
   fileChannel.transferTo(0,fileChannel.size(),sc);
  }
  catch(IOException e)
  {
  e.printStackTrace();
  }finally
  {
  try
  {
  fileInput.close();
  }
  catch(IOException ex){ex.printStackTrace();}
  }
  
}
public static void main(String[] args)throws IOException
{
new FileServer().service();
}
}运行之后会出现以下错误
   Exception in thread "main" java.nio.channels.IllegalBlockingModeException
        at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSele
ctableChannel.java:172)
        at java.nio.channels.SelectableChannel.register(SelectableChannel.java:2
54)
        at FileServer.service(FileServer.java:36)
        at FileServer.main(FileServer.java:136)实在让我不解释啊

解决方案 »

  1.   

        serverSocketChannel.configureBlocking(false);
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);register 不允许 block 模式,而默认的是。 把它设置成false就可以了。你应该仔细看看 register 的API说明。里面很清楚     * @throws  IllegalBlockingModeException
         *          If this channel is in blocking mode