我正在尝试实现一个简单的 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 相同的功能,效果很好。