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

AltStyle によって変換されたページ (->オリジナル) /