I’m trying to create a new ObjectInputStream using an InputStream retrieved from a Socket. Here is my code:
This is the constructor for my MessageGetterSender class. The program does not get to Checkpoint 4.
public MessageGetterSender(Socket socket) {
System.out.println("MessageGetterSender: Checkpoint 1");
this.socket = socket;
// Get input and output streams
try {
System.out.println("MessageGetterSender: Checkpoint 2");
InputStream is = socket.getInputStream();
System.out.println("MessageGetterSender: Checkpoint 3");
this.in = new ObjectInputStream(is);
System.out.println("MessageGetterSender: Checkpoint 4");
} catch (IOException ioe) {
System.out.println("Could not get ObjectInputStream on socket: " + socket.getLocalPort());
}
try {
this.out = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException ioe) {
System.out.println("Could not get ObjectOutputStream on socket: " + socket.getLocalPort());
}
System.out.println("MessageGetterSender: Checkpoint 5");
}
I’m instantiating a new MessageGetterSender object from a class in which I connect to a server to get the socket. Here is the relevant code. It is the constructor for the InstantMessageClass, the class that instantiates the MessageGetterSender object:
public InstantMessageClient(String username) {
try {
socket = new Socket("localhost", 5555);
} catch (IOException ioe) {
System.out.println("Error: Could not connect to socket on port: " + serverPort);
}
messageGetterSender = new MessageGetterSender(socket);
...
Since the code does not execute to Checkpoint 4 but it does get to Checkpoint 3, I’m pretty sure the instantiation of the ObjectInputStream is the culprit. I cannot figure out why though. Any ideas? Thanks for the help.
When you construct an
ObjectInputStream, in the constructor the class attempts to read a header that the associatedObjectOutputStreamon the other end of the connection has written. It will not return until that header has been read. So if you are seeing the constructor ‘hang’, it’s because the other side of the socket either hasn’t used anObjectOutputStream, or hasn’t flushed the data yet.