Java SocketChannel не может отправить данные в ServerSocketChannel - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь написать простой клиент / сервер на Java с использованием NIO и селекторов.Сервер очень прост, и это наиболее типичная реализация, которую вы можете найти везде.Вот код сервера (посмотрите на метод start()):

public final class MyServer {

    private int port;

    private String address;

    public MyServer(String address, int port) {
        this.address = address;
        this.port = port;
    }

    public void start() throws IOException {

        try {

            Selector selector = Selector.open();    

            ServerSocketChannel socket = ServerSocketChannel.open();
            InetSocketAddress addr = new InetSocketAddress(address, port);

            socket.bind(addr);
            socket.configureBlocking(false);

            boolean isAlive = true;
            SelectionKey selectKy = socket.register(selector, SelectionKey.OP_ACCEPT, null);

            while (isAlive) {

                selector.select();

                Set<SelectionKey> keysList = selector.selectedKeys();
                Iterator<SelectionKey> keys = keysList.iterator();

                while (keys.hasNext()) {
                    SelectionKey theKey = keys.next();

                    if (theKey.isAcceptable()) {

                        SocketChannel clientSocket = socket.accept();
                        clientSocket.configureBlocking(false);
                        clientSocket.register(selector, SelectionKey.OP_READ);

                    }

                    if (theKey.isReadable()) {

                        SocketChannel clientSocket = (SocketChannel) theKey.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(9000);
                        clientSocket.read(buffer);

                        String result = new String(buffer.array()).trim();
                        System.out.println(" > SERVER: Request from " + clientSocket.getLocalAddress() + " [ toValidate = " + result + " ], sending tokens...");

                        //Now I send to the client a list
                        buffer.flip();

                        for (int i = 0; i < 5; ++i)
                            buffer.put((byte) getRandom(1, 10));

                        clientSocket.write(buffer);
                        buffer.clear();

                        System.out.println(" > SERVER: Response successfully sent");
                    }

                    keys.remove();
                }
            }

        } catch (Exception e) {
            System.out.println("[ SERVER ALERT: " + e.getMessage() + " ]");
        }

    }
}

Как видите, код довольно простой.Внутри if (theKey.isReadable()) я пытаюсь прочитать небольшую строку из клиента, я печатаю ее на консоль, затем переворачиваю буфер и отправляю некоторые данные обратно клиенту.


Здесь у нас есть клиент, который, к сожалению, имеет проблему, которую я не могу найти:

public void something() throws IOException, InterruptedException {

        ByteBuffer buffer = ByteBuffer.allocate(9000);

        //Note that mRequests is a List of strings
        try (SocketChannel client = SocketChannel.open(new InetSocketAddress(authIPAddr, authPort));) {
            //For each transaction in mRequests, get the tokens from the server and verify them
            for (String s : mRequests) {

                //Write the string to the buffer and send the string
                buffer.put(s.getBytes());
                client.write(buffer);

                buffer.rewind();

                //Get response from the server
                client.read(buffer);
                buffer.clear();      

                Thread.sleep(1000);
            }
        }

    }

Проблема именно здесь:

buffer.put(s.getBytes());
client.write(buffer);

buffer.rewind();

Я могу сказатьпроблема в том, что сервер должен напечатать

SERVER: запрос от /127.0.0.1:2323 [toValidate = {some_value}], отправка токенов ...

но вместо этого он печатает

SERVER: запрос от /127.0.0.1:2323 [toValidate =], отправка токенов ...

и из этого я предполагаю, что данныене отправляются на сервер.Как я могу решить это?

...