Сервер Java NIO в режиме блокировки не работает
Я пытаюсь реализовать простой сервер 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 и сокет, который работает нормально.
2 ответа
Я предлагаю вам пройтись по коду в вашем отладчике. while
петли выглядят совершенно неправильно. Я думаю, что вы должны писать в цикле, и вы хотите очистить после записи. Попробуйте переместить две строки после цикла внутрь цикла.
Вы должны сжать () или очистить () буфер, который был перевернут, прежде чем вы сможете снова прочитать его.