I am having a Java object and now I want to convert it into binary form (binary protocol) and send across the network and a C client will receive it and print the contents. Like I have a Student class
Student.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();
}
}
And the last is server.c, which is in c language.
server.c
/*
* 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;
}
When I am running the server and client. I am getting output like this:
�
sr
xp
I want the output should be name and ID of the student printed on the server.
Please provide your suggestion or any alternate on the same.
ObjectOutputStreamuses a Java serialization mechanism. It's not something that your C server will understand.