as tao said, any language can be used. Infact, you can use any language that is turing complete. Even stupid esoteric languages like brainfuck are capable, but of course, it'd be rediculous to try doing so in such language.
When you realise that it'd only be logical to code in a well-developed HLL, you still have a pretty broad choice, and python is a possibility. The trouble with a language like python though, is it's a dynamically type language, and the compiler will make assumptions about the variable types you're using etc unless you make it not do. You can't let it make such assumptions when you're working with a protocol that needs to be binary exact. It ends up becoming more effort that it would be in a statically typed language where you define everything strictly.
A good question to ask yourself is, can I implement different parts of a server in different languages? For instance, have a DLL written in C which handles serializing messages properly, and interface to it's functions from another language like Python. Another option would be to use IronPython, which can interface to other .Net languages like C#
The logical choice of HLL basically comes down to C, C++, Java, Pascal, VB, C#. Obvious reasons are there's lots of support and existing libraries for them all, and they're all strictly typed languages. For other parts of your project, you can use other languages that can interface to your main one.