-2

我正在尝试实现一个简单的 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:我尝试使用 serversocket 和 socket 来实现与阻塞 io 相同的功能,效果很好。

4

2 回答 2

1

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

于 2014-08-10T07:12:13.917 回答
0

您必须先 compact() 或 clear() 一个已翻转的缓冲区,然后才能再次读取它。

于 2014-08-10T09:57:11.127 回答