Serialization of empty vector over a socket
Robertson, Jason V
jason.v.robertson@intel.com
Fri Jul 19 14:51:00 GMT 2002
Hi,
I've got a simple client-server test case where the server listens on a
socket, accepts a connection, reads in an object, and prints the object's
toString() representation. The client simply opens a port to the server,
and sends a 'new Vector()'. The problem is, the server gets a
NullPointerException in the deserialization process when I compile with gcj
(from GCC 3.1, Linux).
I tried debugging a little, but I'm not sure if serialization is broken on
the client, or deserialization on the server. Here's the output I get on
the server-side, followed by the code. Any ideas?
Thanks,
Jason
-- output from SocketListener.java --
Serialization debugging enabled
STREAM MAGIC STREAM VERSION
Server: waiting for client
MARKER: 0x73 OBJECT
MARKER: 0x72 CLASSDESC NAME=java.util.Vector; UID=d9977d5b803baf01; FLAGS=2;
FIELD COUNT=3
TYPE CODE=I; FIELD NAME=capacityIncrement
TYPE CODE=I; FIELD NAME=elementCount
TYPE CODE=[; FIELD NAME=elementData
MARKER: 0x74 STRING=[Ljava/lang/Object;
ENDBLOCKDATA
MARKER: 0x70 NULL
Reading fields of java.util.Vector
capacityIncrement: 0
elementCount: 0
MARKER: 0x75 ARRAY
MARKER: 0x72 CLASSDESC NAME=[Ljava.lang.Object;; UID=90ce589f1073296c;
FLAGS=2; FIELD COUNT=0
ENDBLOCKDATA
MARKER: 0x70 NULL
ARRAY LENGTH=10; COMPONENT TYPE=class java.lang.Object
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
MARKER: 0x70 NULL
java.lang.NullPointerException
at 0x40227292: _Jv_ThrowSignal (/tmp_proj/gcc/lib/libgcj.so.3)
at 0x402272c6: ?? (??:0)
at 0x40dbc6f4: ?? (??:0)
at 0x4027afcb: java.io.ObjectInputStream.readFields(java.lang.Object,
java.io.ObjectStreamField[], boolean, java.io.ObjectStreamClass)
(/tmp_proj/gcc/lib/libgcj.so.3)
at 0x40279911: java.io.ObjectInputStream.readObject()
(/tmp_proj/gcc/lib/libgcj.so.3)
...
--------------
Client.java
--------------
package socketExample;
import java.util.Vector;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
/**
* Insert the type's description here.
* Creation date: (05/14/2001 4:01:35 PM)
* @author: */
public class Client {
public static void main(String[] args)
{
try {
java.net.Socket s = new
java.net.Socket(args[0],12345);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
ObjectInputStream ois = new ObjectInputStream(in);
ObjectOutputStream oos = new
ObjectOutputStream(out);
System.out.println("obj write");
oos.writeObject(new Vector());
System.out.println("obj written");
}
catch(Exception e) {
System.err.println("Client Error:" + e);
e.printStackTrace();
}
}
}
---------------
Server.java
---------------
package socketExample;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import org.apache.log4j.*;
/**
* Insert the type's description here.
* Creation date: (05/14/2001 3:30:22 PM)
* @author: Nir Antebi
*/
public class SocketListener implements Runnable {
private int m_iPort = 0;
private Thread m_tThread = null;
private ServerSocket m_ssServerSocket;
/**
* nbqListener constructor comment.
*/
public SocketListener(int port) {
super();
setPort(port);
}
/**
* Insert the method's description here.
* Creation date: (05/14/2001 3:56:52 PM)
* @return int
*/
public int getPort() {
return m_iPort;
}
/**
* Insert the method's description here.
* Creation date: (06/19/2001 11:47:16 AM)
* @return java.net.ServerSocket
*/
public java.net.ServerSocket getServerSocket() {
return m_ssServerSocket;
}
/**
* Insert the method's description here.
* Creation date: (05/14/2001 3:30:52 PM)
* @param args java.lang.String[]
*/
public static void main(String[] args)
{
BasicConfigurator.configure(new WriterAppender(new
TTCCLayout("ISO8601"),System.out));
Category.getRoot().setPriority(Priority.INFO);
SocketListener sl1 = new SocketListener(12345);
sl1.start();
}
/**
* When an object implementing interface <code>Runnable</code>
is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately
executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that
it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public void run()
{
// initiate the CommandHandler with the right server
try
{
int MAX_TRIES = 4;
int TIME_TO_SLEEP = 5000;
int tries = 0;
boolean connection =false;
ServerSocket acceptSocket = null;
while (tries < MAX_TRIES && false == connection)
{
try {
acceptSocket = new
ServerSocket(getPort());
connection = true;
break;
}
catch (IOException e)
{
System.out.println("run() -
port" + getPort() + " is buzy try upto " + MAX_TRIES );
Thread.currentThread().sleep(TIME_TO_SLEEP);
tries++;
}
}
if (false == connection)
{
System.out.println("Failed to start
socket listner on port "+ getPort() );
RuntimeException rex = new
RuntimeException("Failed to start socket Listner on port "+ getPort() );
throw rex;
}
setServerSocket(acceptSocket);
System.out.println("Server is up and running on port
" + getPort());
while(true)
{
Socket s = acceptSocket.accept();
System.out.println("Server: accepted");
// create new RequestHandler and go
listen to socket again.
RequestHandler r = new
RequestHandler(s);
//ThreadPool.getInstance().runTask(r);
try
{
r.run();
System.exit(1);
Thread t = new Thread(r);
t.start();
}
catch (Exception e)
{
System.out.println("run() -
socketListner got exception " + e);
}
catch (Throwable t)
{
System.out.println("run() -
socketListner got throwable " +t);
//The ExceptionListener
informs the main thread regarding the exception
}
}
}
catch (IOException ioe)
{
System.out.println ("run() - accept loop IOException
" +ioe);
}
catch (Exception e)
{
System.out.println("run() - Exception " + e);
}
}
/**
* Insert the method's description here.
* Creation date: (05/14/2001 3:56:52 PM)
* @param newPort int
*/
public void setPort(int newPort) {
m_iPort = newPort;
}
/**
* Insert the method's description here.
* Creation date: (06/19/2001 11:47:16 AM)
* @return java.net.ServerSocket
*/
public void setServerSocket(ServerSocket s) {
m_ssServerSocket = s;
}
/**
* Insert the method's description here.
* Creation date: (05/14/2001 3:56:29 PM)
*/
public void start()
{
if (m_tThread == null)
{
m_tThread = new Thread(this);
}
m_tThread.start();
}
/**
* @param
* @throw
* @see
* @exception com.intel.swiss.sws.ngnb.Exceptions.NBException The exception
description.
*/
public void stop()
{
try {
if (null != getServerSocket() )
{
getServerSocket().close();
}
}
catch (IOException e)
{
}
}
}
----------------
RequestHandler.java
----------------
package socketExample;
import java.util.Vector;
import java.util.Hashtable;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.net.*;
/**
* Insert the type's description here.
* Creation date: (05/22/2001 11:54:20 AM)
* @author: Nir Antebi
*/
public class RequestHandler implements Runnable {
private Socket m_sSocket = null;
private final static int MAX_REQUEST_ALLOWED = 400;
private static int m_sCurrentRequestNumber = 0;
/**
* RequestHandler constructor comment.
*/
public RequestHandler(Socket s) {
super();
setSocket(s);
}
/**
* Insert the method's description here.
* Creation date: (10/13/2001 5:52:55 AM)
* @param newCurrentRequestNumber int
*/
synchronized static protected void decreaseCurrentRequestNumber() {
m_sCurrentRequestNumber--;
}
/**
* Insert the method's description here.
* Creation date: (10/13/2001 5:52:55 AM)
* @return int
*/
static protected int getCurrentRequestNumber() {
return m_sCurrentRequestNumber;
}
/**
* Insert the method's description here.
* Creation date: (05/22/2001 11:56:59 AM)
* @return java.net.Socket
*/
private Socket getSocket() {
return m_sSocket;
}
/**
* Insert the method's description here.
* Creation date: (10/13/2001 5:52:55 AM)
* @param newCurrentRequestNumber int
*/
synchronized static protected void increaseCurrentRequestNumber() {
m_sCurrentRequestNumber++;
}
/**
* When an object implementing interface <code>Runnable</code>
is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately
executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that
it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public void run()
{
System.out.println("connection = " + getCurrentRequestNumber()
);
// handle the request
InputStream in=null;
OutputStream out =null;
String hostname = (getSocket().getInetAddress()).getHostName();
try {
in = getSocket().getInputStream();
//in = new
BufferedInputStream(getSocket().getInputStream());
out = getSocket().getOutputStream();
//out = new
BufferedOutputStream(getSocket().getOutputStream());
}
catch(Exception e)
{
return;
}
try {
// delay the connection back
Thread.currentThread().sleep(500);
ObjectOutputStream oos = new
ObjectOutputStream(out);
ObjectInputStream ois = new ObjectInputStream(in);
System.out.println("Server: waiting for client");
Vector inObject = (Vector) ois.readObject();
System.out.println("Server: got string " +
inObject);
getSocket().close();
decreaseCurrentRequestNumber();
}
catch (java.io.IOException e)
{
decreaseCurrentRequestNumber();
e.printStackTrace();
}
catch (Exception e)
{
decreaseCurrentRequestNumber();
e.printStackTrace();
}
catch (Throwable t)
{
decreaseCurrentRequestNumber();
t.printStackTrace();
}
finally
{
System.out.println("Server: out]");
}
}
/**
* Insert the method's description here.
* Creation date: (05/22/2001 11:56:59 AM)
* @param newSocket java.net.Socket
*/
private void setSocket(Socket newSocket) {
m_sSocket = newSocket;
}
}
More information about the Java
mailing list