Chat Server using JAVA
Now, here we need to build two projects, one for server and one for client.
First, we are making project for the server and name this project as ChatServer. Now, go to Main file and right click on it. Go to Refactor, then go to Rename and rename the file as ChatServer and write the following code in it.
ChatServer.java :
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
public class ChatServer {
private static Set<UserThread> userThreads = new HashSet<>();
private static Set<String> userNames = new HashSet<>();
public ChatServer() {
try (ServerSocket serverSocket = new ServerSocket(6666)) {
System.out.println("Chat Server is listening!");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New User Connected!");
UserThread newUser = new UserThread(socket, this);
userThreads.add(newUser);
newUser.start();
}
}catch (IOException ex) {
System.out.println("Error in the server : " + ex.getMessage());
ex.printStackTrace();
}
}
static void addUserName(String userName) { userNames.add(userName); }
static Set<String> getUserNames() { return userNames; }
static void broadcast(String message, UserThread excludeUser) {
for (UserThread aUser : userThreads) {
if (aUser != excludeUser) {
aUser.sendMessage(message);
}
}
}
static void removeUser(String userName, UserThread aUser) {
boolean removed = userNames.remove(userName);
if (removed) {
userThreads.remove(aUser);
System.out.println("The user " + userName + " has quitted.");
}
}
public static void main(String[] args) { new ChatServer(); }
}
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;
public class ChatServer {
private static Set<UserThread> userThreads = new HashSet<>();
private static Set<String> userNames = new HashSet<>();
public ChatServer() {
try (ServerSocket serverSocket = new ServerSocket(6666)) {
System.out.println("Chat Server is listening!");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New User Connected!");
UserThread newUser = new UserThread(socket, this);
userThreads.add(newUser);
newUser.start();
}
}catch (IOException ex) {
System.out.println("Error in the server : " + ex.getMessage());
ex.printStackTrace();
}
}
static void addUserName(String userName) { userNames.add(userName); }
static Set<String> getUserNames() { return userNames; }
static void broadcast(String message, UserThread excludeUser) {
for (UserThread aUser : userThreads) {
if (aUser != excludeUser) {
aUser.sendMessage(message);
}
}
}
static void removeUser(String userName, UserThread aUser) {
boolean removed = userNames.remove(userName);
if (removed) {
userThreads.remove(aUser);
System.out.println("The user " + userName + " has quitted.");
}
}
public static void main(String[] args) { new ChatServer(); }
}
Now, go to Projects tab.
Right Click on src folder, go to New and Click on JAVA Class.
Name the new JAVA Class as UserThread.java
Write the following code in UserThread.java.
UserThread.java :
import java.io.*;
import java.net.Socket;
public class UserThread extends Thread{
private Socket socket;
private ChatServer localhost;
private PrintWriter writer;
public UserThread(Socket socket, ChatServer localhost) {
this.socket = socket;
this.localhost = localhost;
}
public void run() {
try {
String clientMessage;
String serverMessage;
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
OutputStream outputStream = socket.getOutputStream();
writer = new PrintWriter(outputStream, true);
String userName = bufferedReader.readLine();
System.out.println("Username is : " + userName);
ChatServer.addUserName(userName);
printUsers();
do {
clientMessage = bufferedReader.readLine();
serverMessage = "[" + userName + "] : " + clientMessage;
System.out.println(serverMessage);
ChatServer.broadcast(serverMessage, this);
} while (!clientMessage.equals("bye"));
ChatServer.removeUser(userName, this);
socket.close();
} catch (IOException ex) {
System.out.println("Error in UserThread : " + ex.getMessage());
ex.printStackTrace();
}
}
void printUsers() { writer.println("Connected Users : " + ChatServer.getUserNames()); }
void sendMessage(String message) { writer.println(message); }
}
import java.net.Socket;
public class UserThread extends Thread{
private Socket socket;
private ChatServer localhost;
private PrintWriter writer;
public UserThread(Socket socket, ChatServer localhost) {
this.socket = socket;
this.localhost = localhost;
}
public void run() {
try {
String clientMessage;
String serverMessage;
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
OutputStream outputStream = socket.getOutputStream();
writer = new PrintWriter(outputStream, true);
String userName = bufferedReader.readLine();
System.out.println("Username is : " + userName);
ChatServer.addUserName(userName);
printUsers();
do {
clientMessage = bufferedReader.readLine();
serverMessage = "[" + userName + "] : " + clientMessage;
System.out.println(serverMessage);
ChatServer.broadcast(serverMessage, this);
} while (!clientMessage.equals("bye"));
ChatServer.removeUser(userName, this);
socket.close();
} catch (IOException ex) {
System.out.println("Error in UserThread : " + ex.getMessage());
ex.printStackTrace();
}
}
void printUsers() { writer.println("Connected Users : " + ChatServer.getUserNames()); }
void sendMessage(String message) { writer.println(message); }
}
This is the project for server. Now, we are going to write the application for the client.
To write the client application, go to the next Page.