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