In this project, you will implement the chatting program for multiple user. Upon successful implementation of this project, all team members will get 3% of extra credit on top of the final grade. If the team implements GUI for this application, additional 2% will be added (total of 5%). The details of the project are described as follows.
Part 1: Server
The server provides a linking service among the clients (users); the terms “user” and “client” are interchangeably used throughout this project. When the server gets started, it reads a file (“account.txt”) located in the server computer, that contains users’ ids and passwords. Each line in the file contains an account information; id and password separated by one blank space.
account.txt Example id1 password1 id2 password2 id3 password3 id4 password4 …..
After reading “account.txt” file, the server displays the contents of the file and waits for TCP connection request from the client by opening server socket. At this time, server runs a thread for TCP connection from clients. This means that, a new thread will be created and be waiting for the next new TCP connection when one connection is made multithreaded server. The server can take up to 100 concurrent connections.
When the server receives a connection request from any client, it must check how many concurrent connections/users are open/online at this moment. If it is larger than 100, the server sends an error message (the exact string “BUSY”) to the client and doesn’t accept the new connection. If not, it accepts the new connection and proceeds to the following steps.
When the server receives connection requests from the clients, it just follows the same rules of Log-in Phase for Project 3.
Once the client1 is successfully connected to the server, the server sends the list of users who are currently on-line and ready to chat. And the server waits for the client1’s message with the user id (e.g. client2’s user id). When the server receives the user id (with which the client1 wants to chat), it sends client2 the following message;
“CONNECTIONREQUESTED” followed by 2 port numbers, port number2 and port number1 (unique/unused port number randomly chosen by the server between 8000 and
9999), separated by ‘*’ (“CONNECTIONREQUESTED*port number2*port number1”).
These 2 port numbers are unique and randomly chosen by the server between 8000 and 9999.
Then, the server waits for the ACK message from the client2. Once the server receives an
ACK message (“READY”) from the client2, it sends client1 the ip address of the client2
followed by port number1 and port number2; message format will be “client2’s ip address*port number1*port number2”. After sending these 2 messages, the server waits for other messages from both clients.
If the server receives a message “DONE”, then it means that P2P chatting has been done and 2 involved clients are ready for another connection for chatting. When the server receives a message “DISCONNECT”, then the socket connection is closed for that user. When the client leaves the server, the server must update the list of the users who are currently on-line and broadcast it to all clients who are still connected to the server.
Part 2: Client1
The client1 will connect to the server using TCP connection. When the client1 gets started, it asks server’s ip address and port number. Then the user will enter the information to connect to the server. When the client receives an error message (the exact string “BUSY”) from the client and the connection will be terminated.
The client1 follows the same rules of Log-in Phase for Project 3.
Once the client1 logs in to the server, it will receive the list of users who are currently on-line and ready to chat. Then the client1 sends a user (client2’s user id) id in the received list with whom it wants to chat and waits for the response from the server. For this, the client1 program must check if the user enters the valid user id which is in the received list. If it is not, then the client1 program displays an error message and lets the user try again.
Once the client1 receives the client2’s ip address, port number1 and port number2 from the server in the form of “client2’s ip address*port number1*port number2”, then the client1 creates threads (one for server and the other one for client; bidirectional communication between users) to make the connection to the received ip address. port number1 is used client1’s server socket and port number2 is used for client1’s client socket. Once the client1 opens server socket using port number1 and waits for the connection from client2. Then, it uses a client socket to initiate the connection to client2’s server socket. client1 will receive a connection from client2 through server socket and bidirectional communication channel is established between client1 and client2.
Each team will decide how to terminate the chatting.
When client1 wants to leave the chatting system, it must send a message “DISCONNECT” to the server. Then client1 will be removed from the list of available users in the server which will also update “account.txt”.
Part 3: Client2
Let’s assume that client2 is already online and is waiting for server’s message. Once client2 receives a message (“CONNECTIONREQUESTED*port number2*port number1”) from the server, it opens a server socket using port number2 and waits for the connection from client1. In the meantime, client2 creates client socket and tries to connect to client1’s server socket using port number1. Now, bidirectional communication channel is established between client1 and client2.
Each team will decide how to terminate the chatting.