阻塞模式下的Java NIO服务器无法正常工作

时间:2014-08-10 05:01:06

标签: java multithreading nio echo-server

我正在尝试实现一个简单的nio服务器,它接受8070上的连接,并为每个客户端实例化一个新线程。它基本上通过更改其大小写回传给客户端读取的输入文本。我能够连接到服务器,但我回想起的服务器的预期功能不起作用。以下是它的源代码。那么有人可以帮我解决问题吗?

public class NewIOServer {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.socket().bind(new InetSocketAddress("localhost", 8070));
        ExecutorService pool = Executors.newFixedThreadPool(1000);
        while(true) {
            SocketChannel s = ssc.accept();
            pool.submit(new Util(s));
        }
    }
}

public class Util implements Runnable {

    SocketChannel sc;

    public Util(SocketChannel sc) {
        this.sc = sc;
    }

    @Override
    public void run() {
        try {
            process();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void process() throws IOException {
        System.out.println("Connection from:" + this.sc);            
        ByteBuffer buf = ByteBuffer.allocateDirect(1024);
        while(sc.read(buf) != -1) {
            buf.flip();
            for(int i=0; i<buf.limit(); i++) {
                buf.put(i, (byte)transmogrify((int)buf.get(i)));
            }
        }
        sc.write(buf);
        buf.clear();
    }

    public static int transmogrify(int data) {
        if(Character.isLetter(data)) {
            return data ^ ' ';
        }
        return data;
    }
}

PS:我尝试使用服务器套接字和套接字阻止io实现相同的功能,但工作正常。

2 个答案:

答案 0 :(得分:1)

我建议您逐步调试调试器中的代码。 while循环看起来完全错误。我认为你应该在循环中写作,并且你想在写完后清楚。尝试将循环后的两条线移动到循环内部。

答案 1 :(得分:0)

你必须压缩()或清除()一个已被翻转的缓冲区,然后再读入它。