Re: Timeout question on a socket thread
RVic wrote:
My problem is more complicated than I thought. Again, my class is
annotated -- BUT, in run() I need to let it go for a maximim of
maxConnectedTime seconds. If that is exceeded, I need to clean up,
kill this thing. So I create a timer, and an ActionListener to go off
if maxConnectedTime seconds is exceeded. However, I am painted into a
corner and don;t know how to get out! I need to:
1. Be sure I can exit not only the ActionListener method inside the
Timer here, but the entire run() method, i.e. shut this thread down.
2. My cleanup really occurs in the finally block at the end of run().
I cannot simply put that into my ActionListener because of variable
restrictions (i.e. my variables are not final, and if I make surrogate
final variables per Eric's suggestion, I don't know what they are yet,
cannot even declare them.
If there was a way I could force an exception back out to run(), I
could get out of this nice and cleanly when the time was up. But it
seems that connot be done.
How do I get out of this corner?
You are missing the point completely. The simplest way to construct the
server is to have one thread that loops on the ServerSocket. Once you
accept a connection, do the I/O on another thread until you've read
everything or it times out. If it times out, clean up and the leave the
thread. You don't need timers or anything else it's already there. You
can adjust the timeout anytime you aren't blocked. So if you want a
short timeout on the login and a longer timeout on the main I/O thread
you can.
Pseudo code (and it's missing a lot of stuff)
class Server extends Runnable {
public void run() {
while (true) {
try {
Socket s = serverSocket.accept();
Server Task task = new ServerTask(s);
new Thread(task).start();
} catch ( ) {
}
}
}
class ServerTask implements Runnable {
final Socket s;
public ServerTask(Socket s) {
this.s = s;
s.setSoTimeout(20000); // 20 sec timeout
}
public void run() {
try {
while (!endOfStream, true or some other test) {
// read from stream
}
} catch ( ) {
// log errors
} finally {
// clean up
}
}
}
If your time out needs to happen even if there is data coming in then
just close the socket. Add this to the constructor of the ServerTask
(also in pseudo code).
java.util.Timer timer = new java.util.Timer();
timer.schedule(new TimerTask() {
public void run() {
try {
s.close();
} catch ( ) { }
}
},delay);
--
Knute Johnson
email s/nospam/knute2009/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDemon.com<<<<<<------
Unlimited Access, Anonymous Accounts, Uncensored Broadband Access