日期:2014-05-20  浏览次数:20695 次

非阻塞服务器建立问题
这是一份关于建立非阻塞服务器的完整代码,有好几个地方不明白!!!希望高人指教。。。。以前用的都是阻塞式socket通信,第一次接触非阻塞通信,对于缓冲区,以及读写控制等都不是很懂!对于疑惑的地方我在以下代码中标出!求解答。。。(各种函数,类我都在jdk文档中看过解释,所以请勿直接贴解释,比较笨,希望得到通俗易懂的理解)
[code=Java]
package   thread2;
import   java.io.*;
import   java.nio.*;
import   java.nio.channels.*;
import   java.nio.charset.*;
import   java.net.*;
import   java.util.*;

public   class   EchoServer{
    private   Selector   selector   =   null;
    private   ServerSocketChannel   serverSocketChannel   =   null;
    private   int   port   =   8000;
    private   Charset   charset=Charset.forName( "GBK ");

    public   EchoServer()throws   IOException{
        selector   =   Selector.open();
        serverSocketChannel=   ServerSocketChannel.open();
        serverSocketChannel.socket().setReuseAddress(true);
        serverSocketChannel.socket().bind(new   InetSocketAddress(port));
        System.out.println( "服务器启动 ");
    }

    public   void   accept(){
            for(;;){
                try{
                        SocketChannel   socketChannel   =   serverSocketChannel.accept();
                        System.out.println( "接收到客户连接,来自: "   +
                                                              socketChannel.socket().getInetAddress()   +
                                                              ": "   +   socketChannel.socket().getPort());
                        socketChannel.configureBlocking(false);

                        ByteBuffer   buffer   =   ByteBuffer.allocate(1024);
                        synchronized(gate){                                 //问题1:此处同步的运用不是很懂!关gate什么事???后面也有用到
                                selector.wakeup();                           //问题2:wakeup()在此处的作用
                                socketChannel.register(selector,
                                                                              SelectionKey.OP_READ   |
                                                                              SelectionKey.OP_WRITE,   buffer);         //问题3:buffer说是附加的项目,有什么用?