¿Cómo enviar un objeto Java en formato binario y recibirlo en el servidor C?

Tengo un objeto Java y ahora quiero convertirlo en formato binario (protocolo binario) y enviarlo a través de la red y un cliente C lo recibirá e imprimirá el contenido. Como tengo una clase de student.java

  • Estudiante .java

    import java.io.Serializable; public class Student implements Serializable { public String name; public int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } 

    }

  • Client.java

      import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.net.Socket; public class Client{ public static void main(String[] args) throws IOException { Student s1 = new Student(); s1.setId(10); s1.setName("abc"); Socket clientSocket = new Socket("localhost", 7777); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); try{ FileOutputStream fos = new FileOutputStream("data.ser"); ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream()); oos.writeObject(s1); //oos.close(); //fos.close(); } catch(Exception e){ e.printStackTrace(); } clientSocket.close(); } } 

Y el último es mi server.c que está en lenguaje c

/ * Ejemplo de servidor de socket C * /

  #include #include //strlen #include #include //inet_addr #include //write int main(int argc , char *argv[]) { int socket_desc , client_sock , c , read_size; struct sockaddr_in server , client; char client_message[2000]; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } puts("Socket created"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons( 7777 ); //Bind if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { //print the error message perror("bind failed. Error"); return 1; } puts("bind done"); //Listen listen(socket_desc , 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); //accept connection from an incoming client client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); if (client_sock  0 ) { //Send the message back to client printf("\n%s", client_message); write(client_sock , client_message , strlen(client_message)); } if(read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if(read_size == -1) { perror("recv failed"); } return 0; } 

Cuando estoy ejecutando el servidor y el cliente. Estoy geeting salida como esta

    sr xp 

Quiero que la salida sea el nombre y la identificación del estudiante impresos en el servidor.

Por favor, proporcione su sugerencia o cualquier otra alternativa en el mismo

Pruebe CBOR: RFC 7049 Representación concisa de objetos binarios

http://cbor.io/

Una forma estándar de hacer esto es usar CORBA y IIOP.

IIOP es un estándar para transmitir datos binarios a través del cable y también es compatible con implementaciones compatibles de Java EE.

Usted define sus objetos utilizando IDL (Lenguaje de diseño de interfaz) y luego lo usa para generar las estructuras C o C ++ correspondientes, las clases Java o incluso las clases de Python.

Deberá configurar un ORB (Object Request Broker) en el lado de C / C ++. Hay (o solía haber) algunas versiones de código abierto de estos, como OmniORB.

Puede echar un vistazo a CORBA o Thrift , que proporcionan implementaciones básicas de cliente y servidor para la comunicación entre idiomas.

He usado ambos en el pasado (prefiero Thrift) y admite la conversión de datos entre estos idiomas (proporciona API para recuperarlos también).

Sin embargo, una sobrecarga es que necesita crear un contrato por adelantado (archivos de interfaz o idl o thrift, que son bastante fáciles de usar) en cuanto a cómo deben ser los objetos.
Al crear estos contratos, generan archivos jars / header que pueden incluirse en el código, por lo que no tiene que crear esos archivos de clase manualmente en java / cpp.

Puede consultar los enlaces provistos para más información.