天天看點

java 二進制對象_如何以二進制格式發送Java對象并在C伺服器中接收?

我有一個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; }

}

用戶端程式

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語言編寫的。

伺服器

#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) {

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

我希望輸出應該是伺服器上列印的學生的姓名和ID。

請提供您的建議或其他建議。