我正在尝试实现一个简单的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实现相同的功能,但工作正常。
答案 0 :(得分:1)
我建议您逐步调试调试器中的代码。 while
循环看起来完全错误。我认为你应该在循环中写作,并且你想在写完后清楚。尝试将循环后的两条线移动到循环内部。
答案 1 :(得分:0)
你必须压缩()或清除()一个已被翻转的缓冲区,然后再读入它。