J
JTeagle
What is the correct way to determine if a socket to which you were
connected has been closed, either by implicitly calling close() on it,
or because the code that created it has been terminated?
This, for example, does not do what I believe it should:
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class TestSocketCloseApp
{
public static void main(String[] args)
{
try
{
// Create a listening socket.
ServerSocket listener = new ServerSocket(9999);
// Create a client socket and initiate a connection.
Socket client = new
Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
// Stop it from lingering - when we say close, we mean close.
client.setSoLinger(false, 0);
// Accept a connection from this client socket.
Socket server = listener.accept();
// Now close the client connection.
client.close();
// What does the server say our state is?
if (server.isConnected() )
JOptionPane.showMessageDialog(null,"Apparently we're still
connected.");
else
JOptionPane.showMessageDialog(null,"As expected, we're
disconnected.");
server.close();
listener.close();
}
catch(Exception e)
{
}
}
}
It still thinks it's connected when I clearly closed the other end.
I have tried other options in my original code - grabbing the output
stream and sending data (that didn't fail, even though there should be
no link), trying to request the remote address we are connected to -
they all work as if we are still connected.
Does close() not do what it claims? I would say it's fairly
fundamental of any program that deals with socket connections to know
when the other end has dropped.
connected has been closed, either by implicitly calling close() on it,
or because the code that created it has been terminated?
This, for example, does not do what I believe it should:
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JOptionPane;
public class TestSocketCloseApp
{
public static void main(String[] args)
{
try
{
// Create a listening socket.
ServerSocket listener = new ServerSocket(9999);
// Create a client socket and initiate a connection.
Socket client = new
Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
// Stop it from lingering - when we say close, we mean close.
client.setSoLinger(false, 0);
// Accept a connection from this client socket.
Socket server = listener.accept();
// Now close the client connection.
client.close();
// What does the server say our state is?
if (server.isConnected() )
JOptionPane.showMessageDialog(null,"Apparently we're still
connected.");
else
JOptionPane.showMessageDialog(null,"As expected, we're
disconnected.");
server.close();
listener.close();
}
catch(Exception e)
{
}
}
}
It still thinks it's connected when I clearly closed the other end.
I have tried other options in my original code - grabbing the output
stream and sending data (that didn't fail, even though there should be
no link), trying to request the remote address we are connected to -
they all work as if we are still connected.
Does close() not do what it claims? I would say it's fairly
fundamental of any program that deals with socket connections to know
when the other end has dropped.