Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以二进制格式发送Java对象并在C服务器中接收?_Java_Sockets_Jakarta Ee_Networking - Fatal编程技术网

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

如何以二进制格式发送Java对象并在C服务器中接收?,java,sockets,jakarta-ee,networking,Java,Sockets,Jakarta Ee,Networking,我有一个Java对象,现在我想将它转换成二进制形式的二进制协议,并通过网络发送,C客户机将接收它并打印内容。就像我有一个学生班 Student.java Client.java 最后一个是server.c,它是用c语言编写的 服务器.c 我希望输出应该是打印在服务器上的学生的姓名和ID 请提供您的建议或其他建议。请尝试CBOR: RFC 7049简明二进制对象表示法 一种标准方法是使用CORBA和IIOP IIOP是一种用于通过有线传输二进制数据的标准,它还受到兼容的javaee实现的支持 使用

我有一个Java对象,现在我想将它转换成二进制形式的二进制协议,并通过网络发送,C客户机将接收它并打印内容。就像我有一个学生班

Student.java

Client.java

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

服务器.c

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

请提供您的建议或其他建议。

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


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

IIOP是一种用于通过有线传输二进制数据的标准,它还受到兼容的javaee实现的支持

<>使用IDL接口设计语言定义对象,然后使用它生成相应的C结构或C++类、java类甚至python类。 您需要在C/C++端设置一个ORB对象请求代理。目前或过去有一些开源版本,例如OmniORB。

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

我过去使用过这两种语言,我更喜欢Thrift,它支持这些语言之间的数据转换,并提供API来检索它们

然而,一个开销是您需要创建一个契约式的前端接口或idl或thrift文件,这些文件对于对象的外观非常直接。在构建这些契约时,它们生成jar/headerfile,这些jar/headerfile可以包含在代码中,因此您不必在java/cpp中手动创建这些类文件


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

要在不同语言之间传递对象,最好使用标准交换格式,如XML或JSON。ObjectOutputStream使用Java序列化机制。这不是你的C服务器所能理解的。通过他们都能理解的协议,Java序列化不是其中之一。嗨@Abhijeet,我已经在使用Json了,但现在我根本不想使用Json。我正在寻找一些二进制协议,它将把我的对象状态转换成二进制,我将在服务器端用c的结构输入相同的cast,读取RFC。这不是json,它是一种二进制格式。谢谢,我将阅读并尝试实现。简而言之,它将提供java对象到c结构的转换能力,具有与java对象相同的字段。对象到二进制的序列化和对对象的反序列化在CORBA中,但这有相当大的开销。如果在C中每个结构都需要反序列化器和序列化器,那么使用CBOR需要实现反序列化器和序列化器,但这并不像一开始看起来那么多工作。在Java中,Jackson实现将使您非常轻松。如果您还没有决定,您可能希望在完成之前进行检查。您是否有任何小示例,可以将对象创建到二进制Java客户端,并在服务器端以c语言编写并打印对象的值。任何关于这个例子的链接都会很有帮助。我想如果你能顺便说一句,你最好还是坚持使用JSON
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; }

} 
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();
    }

}
/*
 * C socket server example
 */

#include<stdio.h>
#include<string.h>    //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h>    //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) {
        perror("accept failed");
        return 1;
    }
    puts("Connection accepted");

    // Receive a message from client
    while ((read_size = recv(client_sock , client_message , 2000 , 0)) > 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