Мой модуль для удобной работы с L2-потоком:
http://pastebin.com/X9BnJJJ8
Не надо думать о шифровании, о делении потока на пакеты и прочих мелочах.
Требуется установить свои обработчики PacketEvent (сюда передается очередной дешифрованный пакет) и SendEvent (сюда передается строка для передачи на сервер).
Сырые данные от сервера передавать в метод ProcessData, отправлять через метод Send.
Обработчик PacketEvent получает объект класса TL2Packet (доступны все функции ReadX) и управляющий объект класса TL2Stream. Писать данные можно в свой объект TL2Packet (все WriteX функции), а потом вызываеть L2Stream.Send(L2Packet.Data).