如何以二进制格式发送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简明二进制对象表示
一种标准方法是使用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提供的链接。