The most ubiquitous game servers around are for chess. There are hundreds of clients, engines, and server variants. Having these all communicate relatively seamlessly is a good case study of protocol design, whether or not they are perfect.

There are two categories to consider: GUI/Engine and Server/Engine. There are a few standards for both.


--------------------------------------------------------------------------------
GUI & Chess Engine
--------------------------------------------------------------------------------
  Summary:
    Provides means to decouple the GUI and the chess engine. There are a number popular GUIs (XBoard/WinBoard, Babas, etc) and hundreds of engines. Most commonly implemented as text based commands with the GUI launching the engine and using stdin/stdout pipes for communication. Provides extreme flexibility and generally easy to use.

  Protocols:
    XBoard/WinBoard:
       Origins from GUI design to interface with GNUChess years and still has a strong influence from the original GNUChess interface. Somewhat antiquated since it has maintained compatibility since the original release (though multiple protocol version are available are available which relieve some of that).


    UCI (Universal Chess Interface):
      http://wbec-ridderkerk.nl/html/UCIProtocol.html
      Developed recently (2004) as a simplified alternative to XBoard's somewhat complicated and large command set.

      GUI->Engine
        uci: Use UCI interface
        debug [on | off]: Send additional output to GUI
        isready: Sync GUI and engine (answered with readyok)
        setoption name [value]: Engine specific options, passed directly
        register [later | name | code]: Register with engine
        ucinewgame: Signal start of new game to engine (generally followed by
                    board update with position command)
        position [fen | startpos] moves: Can begin a new game by sending
                                         startpos or resume a previous game by sending the board with fen string and subsequent moves.
        go: Start calculating from last position sent. Can be followed by
            searchmoves, ponder, wtime, btime, winc, binc, movestogo, depth, nodes, mate, movetime, infinite
        stop: Stop calculating as soon as possible
        ponderhit: User has played expected move, switch to normal search.
        quit: Stop program as soon as possible.

      Engine->GUI:
        id: Followed by name or author, after uci command sent
        uciok: Sent after ID and optional options to signal ready for UCI
        readyok: Response to isready command, signals ready for more commands
        bestmove [ponder]: Engine stopped searching and found move. Always in
                           response to a go command.
        copyprotection: Used to give copy protected engines a chance to validate
        registration: Used for engines requiring username
        info: Engine sending info to GUI, done whenever any of it changes.
              Valid infos are depth, seldepth, time, nodes, pv, multipv, score,
              curmove, curmovenumber, hashfull, nps, tbhits, cpuload, string, refutation, and currline
        option: Communicating certain standard options and engine specific
                options to the GUI.



--------------------------------------------------------------------------------
Chess Server Protocols
--------------------------------------------------------------------------------
  FICS (Free Internet Chess Server):

  ICC (Internet Chess Club):
    ftp://ftp.chessclub.com/pub/icc/formats/formats.txt

  YICS (Yahoo Internet Chess Server):
    Java applet based.


--------------------------------------------------------------------------------
Other
--------------------------------------------------------------------------------
  Zippy:
    ICS->Engine helper library/program (can be embedded or standalone).
    Allows a chess engine to directly interact with an ICS. Does this by mapping the XBoard protocolobs to what the ICS expects.

  PolyGlot:
    Maps UCI to XBoards and back. Allows for a chess engine written with one to interact with the GUI written for the other.