如何以二进制格式发送Java对象并在C服务器中接收?

我有一个Java对象,现在我想将其转换为二进制forms(二进制协议)并通过网络发送,C客户端将接收它并打印内容。 就像我有一个student.java类

  • 学生.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(); } } 

最后一个是我的server.c,它是用c语言编写的

/ * 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; } 

当我运行服务器和客户端时。 我像这样打算输出

    sr xp     sr xp 

我希望输出应该是服务器上打印的学生的姓名和ID。

请提供您的建议或任何替代方案

尝试CBOR:RFC 7049简明二进制对象表示

http://cbor.io/

一种标准方法是使用CORBA和IIOP。

IIOP是通过线路传输二进制数据的标准,并且也由兼容的Java EE实现支持。

您可以使用IDL(接口设计语言)定义对象,然后使用它来生成相应的C结构或C ++类,Java类甚至Python类。

您需要在C / C ++端设置ORB(对象请求代理)。 有(或曾经是)这些的一些开源版本,如OmniORB。

您可以查看CORBA或Thrift ,它们为跨语言通信提供基本的客户端和服务器实现。

我过去曾经使用过它们(我更喜欢Thrift),它支持这些语言之间的数据转换(提供API来检索它们)。

然而, 一个开销是你需要预先创建一个合约(接口或idl或thrift文件,这是非常直接使用)关于对象应该是什么样子。
在构建这些契约时,它们会生成可以包含在代码中的jar / headerfiles所以您不必在java / cpp中手动创建这些类文件。

您可以参考为moreinfo提供的链接。