Multi Threaded Chat Server

advertisement
Multi Threaded Chat Server
Rick Mercer
1
Client – Server with Socket
Connections
 We've seen how to establish a connection with 1 client
 Review a simple client /server connection next 2 slides
 ServerSocket serverSocket = new ServerSocket(4000);
 System.out.println("This server now awaits one client");
 Socket client = serverSocket.accept();
 ObjectOutputStream output = new

ObjectOutputStream(client.getOutputStream());
 ObjectInputStream input = new

ObjectInputStream(client.getInputStream());
 String clientInput = (String) input.readObject();
 System.out.println("Client wrote: " + clientInput);
 output.writeObject("This server is shutting down.");
 client.close();
2
Then run the client
 Socket server = new Socket("localhost", 4000);
 ObjectOutputStream output = new
ObjectOutputStream(server.getOutputStream());
 ObjectInputStream input = new

ObjectInputStream(server.getInputStream());


 output.writeObject("I am a client");
 String responseToMyOutput = (String) input.readObject();
 System.out.println("Server wrote: " + responseToMyOutput);
 server.close();
3
Practice test question
 What is the output on the computer running the
Server?
 What is the output on the computer running the
Client?
4
One Client at a time
 Server could listen for many clients with an
infinite loop
 while(true) { /* do IO with each client */








// Server code
ServerSocket serverSocket = new ServerSocket(4000);
while (true) {
Socket client = serverSocket.accept();
ObjectOutputStream output =
new ObjectOutputStream(client.getOutputStream());
output.writeObject("Please send money");
}

But they all disappear after connecting as this program
terminates
 The server is still running
5
Build a Chat Server, Client First
 Need the client to check for server output without
interrupting the GUI interaction
 No "frozen" GUI please
 Can type new messages and append incoming
messages
 At the same time
 server writes this
6
Review Threads
 The JVM starts your main (and other threads)
thread
 We can start new stacks by calling run on a new
Thread object
 Using threads can make it appear we are doing
things simultaneously
 type into JTextField at the same time
 Lines 75..84, ActionPerformed
 read input from server Lines 93..97, the loop in
IncomingReader run
 However, when your Java program has the
7
processor, the threads take turns using the
processor
Job: loop to read from server
 The client needs something behind scenes to read
read input from server
 The code that reads input from the server has to run in
a new Thread
 Have to give the Thread--the worker--a runnable,
which is the job the worker is supposed to do
 Lines 52..53
8
Chat Server
 Main thread has a loop to accept new clients
 Each time a new client is accepted, add its
outputStream to an ArrayList
 Also construct a ClientHandler that is all set up in
a new thread
 This thread will wait for subsequent input in a loop
 The main thread is waiting for other connections
 When any client writes to the server, the loop gets
the message Line 51 and tells everyone
 sdf
9
Keeping track of many concurrent
clients for some time
 The server uses a separate thread for each client
 Each thread can wait to read from that client
 Code demo
10
Download