In the the section called “The TCP Client/Server” we developed a full client/server application. The server we developed
could only handle one connection at a time. It was structured to create a 
HandleConnection
object for each conneciton that was made to the server, however, since the 
DateServer
waits for the 
HandleConnection object to deal with the 
DateClient
then it cannot handle any further connections at the same time. You can see this if you run the server and
then connect to it with two clients at the same time - the server will refuse the connectiona as it is
busy serving the current client on port 5050 and has not started listening again.
The Server has however been structured correctly to make it easily threaded by keeping the
connection handler separate from the Server. All that has to be done is to make this connection handler
(the 
HandleConnection class) threaded. Once it is threaded the server can create
a separate thread for every client that connects, where the thread deals completely with that client. When
the client disconnects this thread can finish.
To make the server threaded we can take the 
HandleConnection class from
the section called “The TCP Client/Server” and modify it, by making it inherity from the 
Thread class and
over-riding the 
run() method of the 
Thread class.
The 
DateServer has to be modified slightly to create an object of our new

ThreadedHandleConnection class and to call the 
start(),
method rather than calling the thread's 
run() method directly.
If we do this the 
ThreadedDateServer code should look like:
1
2
3 ...
4
5 public class ThreadedDateServer
6 {
7 public static void main(String args[])
8 {
9 ...
10
11 // Create the Handle Connection object - our new thread
12 // object - only create it
13 ThreadedHandleConnection con = new ThreadedHandleConnection(clientSocket);
14
15 if (con == null) //If it failed send and error message
16 {
17 ...
18 }
19 else { con.start(); } // otherwise we have not failed
20 // to create the HandleConnection object - start this thread now
21 }
22
23 ...
24
25
And the 
ThreadedHandleConnection code should look like:
1 2 3 public class ThreadedHandleConnection extends Thread 4 { 5 6 private Socket clientSocket; // Client socket object 7 private ObjectInputStream is; // Input stream 8 private ObjectOutputStream os; // Output stream 9 private DateTimeService theDateService; 10 11 // The constructor for the connecton handler 12 13 public ThreadedHandleConnection(Socket clientSocket) 14 { 15 this.clientSocket = clientSocket; 16 17 //Set up a service object to get the current date and time 18 theDateService = new DateTimeService(); 19 } 20 21 // The main thread execution method 22 23 public void run() 24 { 25 String inputLine; 26 ... 27 } 28 29 ... etc. (full code below - no changes from here on) 30 31
To make it easier for you to see this update, I have placed all the source files here:
ThreadedDateServer.java
- The new Threaded Server class
ThreadedHandleConnection.java
- The new Handle Connection Thread class
DateClient.java
- The same client, no changes are necessary.
DateTimeService.java
- The same Date/Time Service class.
© 2006
Dr. Derek Molloy
(DCU).