Multi-process/thread - main one is client/server io thread, processes enqueued msgs received - secondary one is to recv, enqueues messages received - secondary one is to send, checks queue for messages to be sent Single-process/thread - each loop - process one incoming msg, if any - process one outgoing msg, if any - check for any user input and current input state, process command if complete one is present states might specify if you're waiting for top level command or gathering data for a specific selected command (need to know when that data is finished so you can process the command data gathered and switch states) e.g. awaiting command, getting port, getting addr, getting membername, getting location, getting activity, getting task, getting message, etc