Re: Creating a multi-user TCP server
jamesgoode wrote:
Hi,
I'm trying to create a multi-user TCP server, without the use of a
thread-per-connection model. My plan is to create an instance of the
ClientConnection class, which is stored in an array, for each
connection. A 'connection listener' thread handles this. The inputs
from the clients are then handled in a loop, which looks like this:
while (true)
{
for (int i = 0; i < MAX_CONNECTIONS; i++)
{
try {
if (connections[i]!=null)
if (connections[i].in.ready())
connections[i].out.writeBytes(connections[i].in.readLine()+"\n
\r");
} catch (IOException e) {
// TODO Auto-generated catch block
connections[i] = null;
}
}
}
(connections[i].in is a BufferedReader)
The problem is, that BufferedReader.ready() always seems to return
true, and that BufferedReader.readLine() halts the program until there
is a line to read.
All help is greatly appreciated.
Many thanks,
--James.
BufferedReader.readLine() blocks until a line terminator is found in the
stream. That is going to be inconvenient for what you have planned. I
think it would be possible to check BufferedReader.ready() in a loop and
read a single char from the stream until ready() returns false, then
move on to your next stream. I don't see anything in the docs that
suggest that ready() will always return true like
InputStream.available() does. One advantage to this method is that it
should scale well with a ThreadPoolExecutor to a lot of connections.
Depending on what sort of latency you can tolerate you might be able to
just block on a read and set a short timeout. Or the other option is to
use NIO and its non-blocking features.
Are you sure that you are going to have so many simultaneous connections
that the thread per connection will be a problem? For a small number of
connections (less than 50 on a Windows machine) it is very easy to code.
--
Knute Johnson
email s/nospam/linux/
--
Posted via NewsDemon.com - Premium Uncensored Newsgroup Service
------->>>>>>http://www.NewsDem