jdk/src/sample/share/nio/chatserver/ClientReader.java
author lana
Thu, 20 Apr 2017 18:14:05 +0000
changeset 44703 755b714df450
parent 39759 427916042881
permissions -rw-r--r--
Added tag jdk-9+166 for changeset 86328fca16ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9254
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     1
/*
39759
427916042881 8161718: Copyright/License updates to corba, jdk
bchristi
parents: 25859
diff changeset
     2
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
9254
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     3
 *
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     4
 * Redistribution and use in source and binary forms, with or without
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     5
 * modification, are permitted provided that the following conditions
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     6
 * are met:
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     7
 *
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     8
 *   - Redistributions of source code must retain the above copyright
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
     9
 *     notice, this list of conditions and the following disclaimer.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    10
 *
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    11
 *   - Redistributions in binary form must reproduce the above copyright
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    12
 *     notice, this list of conditions and the following disclaimer in the
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    13
 *     documentation and/or other materials provided with the distribution.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    14
 *
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    15
 *   - Neither the name of Oracle nor the names of its
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    16
 *     contributors may be used to endorse or promote products derived
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    17
 *     from this software without specific prior written permission.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    18
 *
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    20
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    21
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    22
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    23
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    24
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    25
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    26
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    27
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    28
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    29
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    30
 */
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    31
10292
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    32
/*
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    33
 * This source code is provided to illustrate the usage of a given feature
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    34
 * or technique and has been deliberately simplified. Additional steps
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    35
 * required for a production-quality application, such as security checks,
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    36
 * input validation and proper error handling, might not be present in
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    37
 * this sample code.
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    38
 */
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    39
ed7db6a12c2a 7067811: Update demo/sample code to state it should not be used for production
nloodin
parents: 9254
diff changeset
    40
9254
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    41
import java.nio.ByteBuffer;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    42
import java.nio.channels.CompletionHandler;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    43
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    44
/**
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    45
 * Handles a cycle of reading / writing on the {@code Client}.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    46
 */
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    47
class ClientReader {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    48
    private final DataReader callback;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    49
    private final ChatServer chatServer;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    50
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    51
    ClientReader(ChatServer chatServer, DataReader callback) {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    52
        this.chatServer = chatServer;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    53
        this.callback = callback;
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    54
    }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    55
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    56
    public boolean acceptsMessages() {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    57
        return callback.acceptsMessages();
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    58
    }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    59
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    60
    /**
21591
35320b590d9b 8026491: Typos in string literals
malenkov
parents: 21278
diff changeset
    61
     * Runs a cycle of doing a beforeRead action and then enqueuing a new
9254
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    62
     * read on the client. Handles closed channels and errors while reading.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    63
     * If the client is still connected a new round of actions are called.
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    64
     */
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    65
    public void run(final Client client) {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    66
        callback.beforeRead(client);
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    67
        client.read(new CompletionHandler<Integer, ByteBuffer>() {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    68
            @Override
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    69
            public void completed(Integer result, ByteBuffer buffer) {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    70
                // if result is negative or zero the connection has been closed or something gone wrong
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    71
                if (result < 1) {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    72
                    client.close();
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    73
                    System.out.println("Closing connection to " + client);
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    74
                    chatServer.removeClient(client);
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    75
                } else {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    76
                    callback.onData(client, buffer, result);
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    77
                    // enqueue next round of actions
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    78
                    client.run();
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    79
                }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    80
            }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    81
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    82
            @Override
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    83
            public void failed(Throwable exc, ByteBuffer buffer) {
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    84
                client.close();
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    85
                chatServer.removeClient(client);
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    86
            }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    87
        });
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    88
    }
142881732d3c 7026287: Asynchronous API sample
rbackman
parents:
diff changeset
    89
}