Introduction: Creating a Chat Server Using Java
Networking is a major branch of programming that is vital to connecting users through devices. As such many programming languages have multiple ways to form connections users and servers or between peers. For starting out programming, Java is one of the first languages many programmers learn, and one of the interesting ways java can handle network connections is through the use of Java Sockets. I have prepared this tutorial to instruct how to use sockets in java by developing a chat server between one server and many users. This tutorial is divided between client side and server side development.
- Java JDK (I used version 1.8.0_74 for this)
- Java IDE (I used Eclipse Mars for this)
- A package structure with the above classes
Timer: About 15-30 minutes
Skill: This guide assumes that you have basic Java experience and are familiar with common Java I/O types
Step 1: Setup a ServerSocket in the Server Class
Create a static Server socket at the beginning of main in the ChatServer class and instantiate it with a port number.
TIP: ServerSockets may be instantiated with a port number other than 4444, but numbers lower than 1000 are more likely to already be in use by the system.
Step 2: Create a Socket in the Login Class
Create a socket in the main method of Login, specifying the host address and port number. Since this is a login window, the socket can be an instance variable as it will be passed to the actual chat window later.
TIP: "localhost" is used in the socket parameters for debugging purposes to specify that the server is running on the same computer as the client. Later this can be changed to take a host address to connect to a remote server.
Step 3: Create a Loop to Continuously Accept Clients
After instantiating the serverSocket in chatServer, start a while loop that continuously accepts all clients.
Step 4: Create the Client Threads
- With the socket received from serversocket.accept, create a new ClientThread .
- Create a new Thread using the ClientThread, and then call start on the thread.
- In ClientThread, make ClientThread extend ChatServer, and implement Runnable
- Create the ClientThread constructor and add the method run.
Step 5: Create the Server Thread
- Create a new ServerThread using socket.
- Create a new Thread using the ServerThread, and then call start on the thread.
- In ServerThread, make ServerThread implement Runnable
- Create the ServerThread constructor and add the method run.
Step 6: Make the Client Thread Send and Receive Data
- In ClientThread make a private BufferedReader in to receive data from clients, and a PrintWriter to write to the client.
- Create a getter for the PrintWriter
- Initialize the PrintWriter in run with the socket's output stream, and the BufferedReader with a new InputStreamReader using the socket's input stream
- Create a while loop in run that checks for any new input and prints the input to all clients using the list of ClientThreads and the getter for the PrintWriter
Step 7: Make the Server Thread Send and Receive Data
- In ServerThread make a private BufferedReader in to receive data from the server, another BufferedReader to receive data from the user, and a PrintWriter to write to the server.
- Initialize the PrintWriter in run with the socket's output stream, the server's BufferedReader with a new InputStreamReader using the socket's input stream, and the user's BufferedReader with a new InputStreamReader using System.In
- Create a while loop in run that checks for any new input from the server and prints the input to the console, and checks for any new input from the user and prints that input to the server.
Step 8: Test the Server and Add Optional Functionality
After running the server and launching clients, the program should relay all messages from each client to all other clients. This was a small test of what can be done with java sockets.
You can expand on this project by adding functionality to let the server itself relay messages, archiving messages, allowing other forms of input and more to become more familiar with java sockets and networking in general.