Consiglio davvero di non utilizzare direttamente la libreria Java Sockets. Ho trovato Netty (di JBoss) molto semplice da implementare e davvero potente. La classe Netty ChannelBuffer ha una vasta gamma di opzioni per scrivere diversi tipi di dati e, naturalmente, può scrivere i tuoi codificatori e decodificatori per scrivere POJO nel flusso, se lo desideri.
Questa pagina è un ottimo inizio - Sono riuscito a creare un client/server abbastanza sofisticato con codificatori e decodificatori personalizzati in meno di 30 minuti a leggere questo: http://docs.jboss.org/netty/3.2/guide/html/start.html.
Se si desidera utilizzare realmente socket Java. Il flusso di output presa può essere avvolto in un DataOutputStream, che ti permette di scrivere molti tipi di dati diversi, come pure, per esempio:
new DataOutputStream(socket.getOutputStream()).writeInt(5);
Spero che sia utile.
Sei sicuro che il programma C e il programma Java trattino gli input binari e le stringhe allo stesso modo? Se non lo sei, inviale come vecchio testo. Se non hai il controllo del programma C leggendo il socket, non avrai altra scelta se non quella di inviare i dati in qualunque formato sia richiesto dal programma C. –