| 
 | " 2013 FRC Java API" | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||
java.lang.Objectcom.sun.squawk.io.mailboxes.ServerChannel
public final class ServerChannel
Given that a Channel is a one-to-one connection between two isolates, a ServerChannel 
 provides a factory to create new Channels by name. It is similar to how network sockets
 can use a port number to accept a number of client connections.
 
 A server can use the accept method to accept new client connections, which will return a new Channel
 that the server can use to talk to the client. A server may choose to service each Channel in a separate thread.
 
class NewChannelTimeTest {
    public final static String MAILBOX_NAME = "NewChannelTimeTest";
    public static final String msg1 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
    public final static int NUM_MESSAGES = 1000;
    public final static int NUM_CLIENTS = 3;
    public static void main(String[] args) throws Exception {
        Client client =new Client();
        Server server = new Server();
        server.start();
        client.start();
        client.join();
        server.join();
    }
    static class Client extends Thread {
        public void run() {
             try {
                byte[] data = msg1.getBytes();
                long start = System.currentTimeMillis();
                Channel testChan = Channel.lookup(MAILBOX_NAME);
                for (int i = 0; i < NUM_MESSAGES; i++) {
                    Envelope cmdEnv = new ByteArrayEnvelope(data);
                    testChan.send(cmdEnv);
                    ByteArrayEnvelope replyEnv = (ByteArrayEnvelope)testChan.receive();
                    byte[] replyData = replyEnv.getData();
                    if (replyData.length != 1 || (replyData[0] != 0)) {
                        System.err.println("Reply not OK");
                    }
                }
                long time = System.currentTimeMillis() - start;
                System.err.println("Client sent " + NUM_MESSAGES + " messages of " + data.length + " bytes in " + time + "ms");
                testChan.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    static class Server extends Thread {
        public void run() {
            byte[] replyData = new byte[1];
            ServerChannel serverChannel = null;
            Channel aChannel = null;
            try {
                serverChannel = ServerChannel.create(MAILBOX_NAME);
            } catch (MailboxInUseException ex) {
                throw new RuntimeException(ex.toString());
            }
            try {
                aChannel = serverChannel.accept();
                // handle messages:
                while (true) {
                    Envelope msg;
                    try {
                        msg = aChannel.receive();
                    } catch (MailboxClosedException e) {
                        System.out.println("Server seems to have gone away. Oh well. " + aChannel);
                        break;
                    }
                    if (msg instanceof ByteArrayEnvelope) {
                        ByteArrayEnvelope dataEnv = (ByteArrayEnvelope)msg;
                        byte[] data = dataEnv.getData();
                        replyData[0] = 0;
                        Envelope replyEnv = new ByteArrayEnvelope(replyData);
                        try {
                            aChannel.send(replyEnv);
                        } catch (AddressClosedException ex) {
                            System.out.println("Client seems to have gone away. Oh well. " + aChannel);
                        }
                    }
                }
            } catch (IOException ex) {
                // ok, just close server.
            } finally {
                // no way to get here:
                System.out.println("Closing server...");
                aChannel.close();
                serverChannel.close();
            }
        }
    }
}
 
Channel| Method Summary | |
|---|---|
|  Channel | accept()Wait for a client to open a connection, then create an anonymous local Channel to use or further communication. | 
|  void | close()Unregisters this ServerChannel. | 
| static ServerChannel | create(String name)Creates a new ServerChannel with the given name and registers it with the system. | 
|  String | getName()Get the name that this ServerChannel was registered under. | 
|  boolean | isOpen()Return true if the server channel is open, registered, and can accept new connections.. | 
|  void | reOpen()Re-opens a closed ServerChannel. | 
| Methods inherited from class java.lang.Object | 
|---|
| equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | 
| Method Detail | 
|---|
public static ServerChannel create(String name)
                            throws MailboxInUseException
name - the name that this ServerChannel can be looked up under.
MailboxInUseException - if there is already a ServerChannel registered under the name name.
public void reOpen()
            throws MailboxInUseException
Can be called after hibernation or an explicit call to close() closed this ServerChannel.
NOTE: To avoid race conditions during hibernation, should sleep a little (100ms) between getting a MailboxClosedException and calling reOpen().
MailboxInUseException - if there is already a ServerChannel registered under the name name.
IllegalStateException - if the ServerChannel is already open.public String getName()
public Channel accept()
               throws MailboxClosedException
MailboxClosedException - if the ServerChannel is closed (either explicitly, or by isolate hibernation)public void close()
public boolean isOpen()
| 
 | " 2013 FRC Java API" | |||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | |||||||||