I am making a Server/Client program in Java. The server waits for a connection then makes a new thread for that connection. The server then goes back and listens for connections on other ports.
sck = srvrSckt.accept();
server.numConnections++;
System.out.print("Connection was made on " + server.port[i] + ".\n");
Connections conn = new Connections(sck);
server.threads[i] = new Thread(conn);
server.threads[i].start();
After a connection has been made, I want to go back and check if any previous connections have closed. Then I will mark these ports as available for futu开发者_高级运维re connections to be made on. Is there a way to do this?
I have read that the best way to communicate between threads is with a shared variable. However, I cannot find a good example of this. Also, I am not sure if a shared variable would work because I not only want to check for connections that were successfully closed, but also for connections that were disconnected abruptly.
Any help you can offer will be greatly appreciated. Thank-you.
EDIT:
Here is a larger portion of the code. That may make my question more clear.
if (server.isAvailable[i] == true)
{
availablePort = server.allPorts[i];
server.isAvailable[i] = false;
ServerSocket srvrSckt = new ServerSocket(availablePort);
System.out.println("Waiting for connection on port " + availablePort + "...");
srvrSckt.setSoTimeout(5000);
try {
sck = srvrSckt.accept();
server.numConnections++;
System.out.print("Connection was made on " + server.port[i] + ".\n");
Connections conn = new Connections(sck);
server.threads[i] = new Thread(conn);
server.threads[i].start();
} catch (Exception e) {
server.isAvailable[i] = true; // no connection was made
srvrSckt.close();
}
To my understanding, you have absolutely no control over assigning ports to incoming remote TCP connections. That's the job of the operating system. A socket is closed when Socket.isClosed returns true or when Socket.getInputStream.read returns -1 indicating end of stream.
After a connection has been made, I want to go back and check if any previous connections have closed
Normally , the best way to detect on the server the end of a session with a client is to set up of the "goodbye-protocol" between client and server. A fixed token is posted by the client to server and server acknowledges by closing the channel. If the client terminates abruptly , then the only way on server to know about this is to setup a heart-beat protocol, every certain time of inactivity , the server will ping client and the client must respond by pingback. If there is no response , server must terminate the client session.
As for sharing a variable between threads , you may refer : http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html
精彩评论