处于阻塞模式的Java NIO服务器不工作

处于阻塞模式的Java NIO服务器不工作,java,multithreading,nio,echo-server,Java,Multithreading,Nio,Echo Server,我试图实现一个简单的nio服务器,它接受8070上的连接,并为每个客户机实例化一个新线程。它基本上通过改变大小写将读取的输入文本回显到客户端。我可以连接到服务器,但服务器回显的预期功能不起作用。下面是它的源代码。有人能帮我解决它的问题吗 public class NewIOServer { public static void main(String[] args) throws IOException { ServerSocketChannel ssc = 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;
    }
}
公共类NewIOServer{
公共静态void main(字符串[]args)引发IOException{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.socket().bind(新的InetSocketAddress(“localhost”,8070));
ExecutorService池=Executors.newFixedThreadPool(1000);
while(true){
SocketChannel s=ssc.accept();
提交(新的Util);
}
}
}
公共类Util实现可运行{
SocketChannel sc;
公共用途(SocketChannel sc){
这个.sc=sc;
}
@凌驾
公开募捐{
试一试{
过程();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有void进程()引发IOException{
System.out.println(“连接源:“+this.sc”);
ByteBuffer buf=ByteBuffer.allocateDirect(1024);
while(sc.read(buf)!=-1){
buf.flip();

对于(int i=0;i我建议您在调试器中单步执行代码。
while
循环看起来完全错误。我认为您应该在循环中写入,并且希望在写入后清除。尝试将循环后的两行移到循环内。

您必须压缩()或清除()一个缓冲区,在你可以再次读取它之前已经被翻转过。

如果那些投反对票的人告诉我这样做的原因,这将是很有帮助的。仅供参考,我只是一个java套接字编程的新手,所以这就是为什么问题很简单。对于初学者来说,你应该添加你的代码是如何不工作的。它不编译吗?它崩溃了吗?你知道吗输出错误?