Теоретически, можно сделать два сокета от клиента к серверу и клиент в один будет писать и получать обычные запросы, а из другого - читать о внезапных появлениях новых сообщений. Читающий поток на клиенте будет блокироваться, пока чего-нибудь не получит.
Но я хз, насколько это адекватный способ. Мне почему-то кажется, что в один сокет не стоит одновременно пихать данные с двух сторон и пытаться их потом читать. Но ты попробуй, вдруг получится.
P.S. К слову, если писать сервер на java, то можно юзать встроенную в язык сериализацию и без проблем передавать объекты туда-сюда.
UPD: вот
тут пишут, что вроде одного хватит