2017-01-19 4 views
0

У меня есть объект Java, и теперь я хочу преобразовать его в двоичную форму (двоичный протокол) и отправить по сети, и клиент C получит его и распечатает содержимое. Как у меня есть класс student.javaКак отправить объект Java в двоичном формате и получить на сервере C?

  • Студент .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, который я s в языке Си

/* C сокет пример сервера */

#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 

Я хочу, чтобы на выходе указывалось имя и идентификатор студента, напечатанного на сервере.

Просьба представить свое предложение или любого заместителя на том же

+0

Чтобы передавать объекты между различными языками, лучше использовать стандартные форматы обмена, например, XML или JSON. – Berger

+0

'ObjectOutputStream' использует механизм сериализации Java. Это не то, что ваш сервер C будет понимать. – Kayaman

+0

Через протокол, который они оба понимают, и Java Serialization - это * не * один из них. – EJP

ответ

0

Попробуйте CBOR: RFC 7049 Сжатый двоичный объект Представление

http://cbor.io/

+0

Привет @Abhijeet, я уже использовал Json, но теперь я не хочу использовать json вообще. Я ищу несколько бинарных протоколов, которые преобразуют мое состояние объекта в двоичном формате, и я буду вводить то же самое с использованием структуры в c на стороне сервера, –

+0

Прочитайте RFC [http://www.rfc-base.org/txt/ гк-7049.txt] (http://www.rfc-base.org/txt/rfc-7049.txt). Это не json, это двоичный формат. –

+0

Спасибо, прочитаю и попытаюсь реализовать. Короче говоря, это обеспечит возможность преобразования java-объекта в c-структуру с теми же полями, что и объект java. –

0

Один стандартный способ сделать это состоит в использовании CORBA и IIOP.

IIOP - это стандарт для передачи двоичных данных по проводу и также поддерживается совместимыми реализациями Java EE.

Вы определяете свои объекты с помощью IDL (Interface Design Language), а затем используете это для создания соответствующих C-структур или классов C++, классов Java или даже классов Python.

Вам необходимо настроить ORB (Брокер запросов объектов) на стороне C/C++. Существует (или используется) несколько версий с открытым исходным кодом, таких как OmniORB.

+0

У вас есть небольшой пример создания объекта в двоичном виде (на стороне клиента Java) и получить его на стороне сервера, написанной на c, и печати значений объекта. Любая ссылка для примера также поможет. –

+0

Я ничего не писал в C почти 20 лет, поэтому извините - нет, я этого не делаю ... –

+0

Я думаю, что вам действительно лучше придерживаться JSON, если вы можете BTW –

0

Вы можете взглянуть на CORBA или Thrift, которые обеспечивают базовые реализации клиентов и серверов для межязыковой связи.

Я использовал их оба в прошлом (я предпочитаю Thrift) и поддерживает преобразование данных между этими языками (предоставляет API для их извлечения).

Однако одна накладная заключается в том, что вам необходимо создать контракт спереди (интерфейс или idl или бережливые файлы, которые довольно прямолинейно используются) относительно того, как должны выглядеть объекты.
При создании этого контракта они генерируют jars/headerfiles, которые могут быть включены в код. Таким образом, вам не нужно создавать эти файлы классов вручную в java/cpp.

Вы можете обратиться к ссылкам, предоставленным для более подробной информации.