Realmente recomendaría no utilizar la biblioteca Java Sockets directamente. Descubrí que Netty (de JBoss) es realmente fácil de implementar y realmente poderoso. La clase Netty ChannelBuffer viene con una gran cantidad de opciones para escribir diferentes tipos de datos y, por supuesto, para escribir sus propios codificadores y decodificadores para escribir POJO en la secuencia, si lo desea.
Esta página es realmente buena: pude hacer un cliente/servidor bastante sofisticado con codificadores y decodificadores personalizados en menos de 30 minutos leyendo esto: http://docs.jboss.org/netty/3.2/guide/html/start.html.
Si realmente desea usar sockets de Java. El flujo de salida de socket puede ser envuelto en una DataOutputStream que le permite escribir muchos diferentes tipos de datos, así, por ejemplo:
new DataOutputStream(socket.getOutputStream()).writeInt(5);
espero que sea útil.
¿Estás seguro de que el programa C y el programa Java tratan las cadenas y los caracteres binarios de la misma manera? Si no es así, envíelos como texto antiguo. Si no tiene control del programa C leyendo el socket, entonces no tendrá más remedio que enviar los datos en el formato que desee el programa C. –