5

I am about to implement a API for my TCP/IP server written in Java. Right now I have a temporary method that takes a String, executes a command based on the String and returns a String basically like the following.

public void communicate(BufferedReader in, PrintWriter out) {
    while(true) {
        out.println(handleCommand(in.readLine()));
    }
}

private String handleCommand(String command) {
    if (command.equals("command1") {
        // do stuff
        return "Command 1 executed";
    } else if (command.equals("command2") {
        // do some other stuff
        return "Command 2 executed";
    }
}

I really want to do something more extensible, smarter and stateful, so I could handle more complex and stateful commands and without the method/class getting bloated.

How would you start?

Suggestions, ideas, or links for further reading are very welcome.

2 Answers 2

2

I'd suggest using an interface, such as:

interface Command {
   public boolean doCommand();
}

enum CommandNames {
   COMMAND1("COMMAND1"),
   COMMAND2("COMMAND2");

   // other enum stuff

   // Gets a command based on a name
   public static CommandNames getCommand(String name);
}

Usage:

Map<CommandNames, Command> commands;

private String handleCommand(String command) {
   Command command = commands.get(CommandNames.getCommand(command));

   command.handleCommand();
}

First draft, but it ought to at least give you some ideas.

1
  • Enums looks like a good way to go, thank you very much for your suggestion, very helpful :)
    – Svante
    Commented Feb 25, 2011 at 8:59
2

The easiest one is thread-per-connection. With flow like:

while (true) {
    accept a connection ;
    create a thread to deal with the client ;
end while

That's good enough even for relatively high traffic.

For extreme performance under very high traffic, you'd rather need event-driven/asynchronous server. These tend to be more complicated, so in that case I'd recommend you to base your solution on existing one, like JBoss' Netty or Apache MINA. Just that you get idea of the performance here, event-driven servers we're designed to combat the C10K problem (10,000+ concurrent client connections).

2
  • I was rather looking for a smarter API (command handling) implementation. I already have the code for handling the connection initialization. But thanks for you answer :)
    – Svante
    Commented Feb 25, 2011 at 8:58
  • I guess I've focused too much on the word "pattern" in title ;-)
    – vartec
    Commented Feb 25, 2011 at 10:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.