coder87
October 31st, 2009, 06:25 AM
hi guys im tryin to do a java client / c++ server socket program .in the java client program i serialize the object and pass them over socket to c++ server.now when im gettin them in c++,im not able to deserialize it properly as i tried for binary serialization since c++ does not support object serialization.but it didnt work out properly,as when im printin the member variables of c++ class im gettin junk values.i did came across many libraries like Boost which supports serialization but was not sure whether it will deserialize a java object.
so what if my approach for dis problem is right or shud i go for JNI or any other concepts.if its in JNI then i fear my c++ server 'ill be loaded as shared library file along with java file at runtime which i think 'ill not be a right way to do client-server socket program.
my java client code:
import java.io.*;
import java.net.*;
public class KnockKnockClient
{
public static void main(String[] args) throws IOException
{
Socket kkSocket = null;
ObjectOutputStream oos=null;
Sample s;
String str="hello dude";
try{
kkSocket = new Socket("localhost", 4455);
oos = new ObjectOutputStream(kkSocket.getOutputStream());
}
catch (UnknownHostException e)
{
System.err.println("Don't know about host: 192.168.1.137.");
System.exit(1);
}
catch (IOException e)
{
System.err.println("Couldn't get I/O for the connection to: 192.168.1.137.");
System.exit(1);
}
s=new Sample();
oos.writeObject(s);
System.out.println("name :" + s.name);
System.out.println("age :" + s.value);
kkSocket.close();
}
}
class Sample implements Serializable
{
String name="xyz";
int value=10;
}
my c++ server code :
#include <iostream>
#include <fstream>
#include <string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<fcntl.h>
using namespace std;
class Data
{
public:
char data1[255];
char val1[255];
};
int main()
{
int create_socket,new_socket,fd;
socklen_t addrlen;
struct sockaddr_in address;
if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
cout<<"The socket was created\n";
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY;inet_addr("localhost");
address.sin_port = htons(4455);
cout<<"\nworking";
if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
cout<<"Binding Socket\n";
listen(create_socket,3);
addrlen = sizeof(struct sockaddr_in);
cout<<"*************************\n";
new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
cout<<"*************************\n";
Data dobj;
if (new_socket > 0)
{
cout<<"The Client "<<inet_ntoa(address.sin_addr)<<" is Connected...\n";//inet_ntoa(address.sin_addr));
int ch = recv(new_socket,&dobj,1023,0);
perror("recv");
cout<<"Status = "<< ch<<"\n";
ifstream in("binary.txt", ios::binary);
in.read((char*)&dobj, sizeof(dobj));
if(ch !=-1)
{
cout<<"Client: received "<<dobj.data1<<"\n";
cout<<"Client: received "<<dobj.val1<<"\n";
cout<<"Request Completed\n";
}
else
perror("recv");
}
else
{
cout<<"Client not connected ...\n";
}
close(new_socket);
return close(create_socket);
}
o/p for client / server looked like this:
java client:
*******************
*******************
Exception in thread "main" java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1855)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1764)
at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1266)
at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1220)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1555)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at KnockKnockClient.main(KnockKnockClient.java:36)
c++ server:
The socket was created
workingBinding Socket
***********************
***********************
The Client 127.0.0.1 is Connected...
recv: Success
Status = 4
Client: received �
Client: received +
Request Completed
thanx
so what if my approach for dis problem is right or shud i go for JNI or any other concepts.if its in JNI then i fear my c++ server 'ill be loaded as shared library file along with java file at runtime which i think 'ill not be a right way to do client-server socket program.
my java client code:
import java.io.*;
import java.net.*;
public class KnockKnockClient
{
public static void main(String[] args) throws IOException
{
Socket kkSocket = null;
ObjectOutputStream oos=null;
Sample s;
String str="hello dude";
try{
kkSocket = new Socket("localhost", 4455);
oos = new ObjectOutputStream(kkSocket.getOutputStream());
}
catch (UnknownHostException e)
{
System.err.println("Don't know about host: 192.168.1.137.");
System.exit(1);
}
catch (IOException e)
{
System.err.println("Couldn't get I/O for the connection to: 192.168.1.137.");
System.exit(1);
}
s=new Sample();
oos.writeObject(s);
System.out.println("name :" + s.name);
System.out.println("age :" + s.value);
kkSocket.close();
}
}
class Sample implements Serializable
{
String name="xyz";
int value=10;
}
my c++ server code :
#include <iostream>
#include <fstream>
#include <string>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/stat.h>
#include<fcntl.h>
using namespace std;
class Data
{
public:
char data1[255];
char val1[255];
};
int main()
{
int create_socket,new_socket,fd;
socklen_t addrlen;
struct sockaddr_in address;
if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
cout<<"The socket was created\n";
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY;inet_addr("localhost");
address.sin_port = htons(4455);
cout<<"\nworking";
if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
cout<<"Binding Socket\n";
listen(create_socket,3);
addrlen = sizeof(struct sockaddr_in);
cout<<"*************************\n";
new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
cout<<"*************************\n";
Data dobj;
if (new_socket > 0)
{
cout<<"The Client "<<inet_ntoa(address.sin_addr)<<" is Connected...\n";//inet_ntoa(address.sin_addr));
int ch = recv(new_socket,&dobj,1023,0);
perror("recv");
cout<<"Status = "<< ch<<"\n";
ifstream in("binary.txt", ios::binary);
in.read((char*)&dobj, sizeof(dobj));
if(ch !=-1)
{
cout<<"Client: received "<<dobj.data1<<"\n";
cout<<"Client: received "<<dobj.val1<<"\n";
cout<<"Request Completed\n";
}
else
perror("recv");
}
else
{
cout<<"Client not connected ...\n";
}
close(new_socket);
return close(create_socket);
}
o/p for client / server looked like this:
java client:
*******************
*******************
Exception in thread "main" java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1855)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1764)
at java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1266)
at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1220)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1555)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
at KnockKnockClient.main(KnockKnockClient.java:36)
c++ server:
The socket was created
workingBinding Socket
***********************
***********************
The Client 127.0.0.1 is Connected...
recv: Success
Status = 4
Client: received �
Client: received +
Request Completed
thanx