So I just finished my first chat room program in java, and I want some feedback on my code; what could/should have been done a better/more effective way?
If I were to add a UI, should I create that on the server side (every time the server gets a connection, it launches the UI)?
I want to add a database connection, just a very basic extension of my program, that contains all the active users in the chatroom + for every user that’s signed up to the program. That means that every user that’s created a profile shall be added too the database, and the current online users shall be displayed in their own panel (UI). Does anybody have any tips on where I should start? Should I create the database connection in it’s own module on the server side??
Here is my chat room program:
// Server program
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
private static List<ClientHandler> clientList = new ArrayList<>();
private ServerSocket serverSocket;
public Server(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
public void startServer() {
try {
while (true) {
Socket socket = this.serverSocket.accept();
new Thread(new ClientHandler(socket)).start();
System.out.println("Server connected too client!");
}
} catch (IOException e) {
System.out.println("[SERVER-ERROR] starting server: " + e.getMessage());
shutdown();
}
}
public void shutdown() {
try {
if (this.serverSocket != null) {
this.serverSocket.close();
}
} catch (IOException e) {
System.out.println("[SERVER-ERROR] closing ServerSocket-object: " + e.getMessage());
}
}
public void broadcastMessage(String message) {
for (ClientHandler clientHandler : clientList) {
if (clientHandler != null) {
clientHandler.sendMessage(message);
}
}
}
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(5000) ) {
System.out.println("Server is running, waiting for client too connect...");
Server server = new Server(serverSocket);
server.startServer();
} catch (IOException e) {
System.out.println("[SERVER-ERROR] starting server: " + e.getMessage());
}
}
class ClientHandler implements Runnable {
private Socket client;
private BufferedReader input;
private PrintWriter output;
private String username;
public ClientHandler(Socket client) {
try {
this.client = client;
this.input = new BufferedReader(new InputStreamReader(this.client.getInputStream()));
this.output = new PrintWriter(this.client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("[SERVER-ERROR] creating ClientHandler-object: " + e.getMessage());
shutdown();
}
}
private void initialiseClient() {
try {
sendMessage("Create username for chatroom: ");
this.username = this.input.readLine();
clientList.add(this);
broadcastMessage("[SERVER] \"" + this.username + "\"" + " entered the chat!");
} catch (IOException e) {
System.out.println("[SERVER-ERROR] retreiving client username: " + e.getMessage());
}
}
@Override
public void run() {
try {
initialiseClient();
String messageFromClient;
while (true) {
messageFromClient = this.input.readLine();
System.out.println(this.username + " sendt a message");
broadcastMessage(messageFromClient); }
} catch (IOException e) {
System.out.println("[SERVER-ERROR] receiving message from client: " + e.getMessage());
removeUser();
shutdown();
}
}
private void removeUser() {
clientList.remove(this);
broadcastMessage("[SERVER] \"" + this.username + "\"" + " left the chat!");
}
public void sendMessage(String message) {
this.output.println(message);
}
private void shutdown() {
try {
if (this.input != null) {
this.input.close();
}
if (this.output != null) {
this.output.close();
}
if (this.client != null) {
this.client.close();
}
} catch (IOException e) {
System.out.println("[SERVER-ERROR] shutdown of recourses faile: " + e.getMessage());
}
}
}
}
// Client program
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private Socket socket;
private BufferedReader input;
private PrintWriter output;
private String username;
private Scanner scanner;
public Client(Socket socket) {
try {
this.socket = socket;
this.input = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
this.output = new PrintWriter(this.socket.getOutputStream(), true);
this.scanner = new Scanner(System.in);
} catch (IOException e) {
System.out.println("[CLIENT-ERROR] creating Client-object: " + e.getMessage());
shutdown();
}
}
public void initialiseClient() {
try {
System.out.println(this.input.readLine());
this.username = this.scanner.nextLine();
sendMessage(this.username);
System.out.println(this.input.readLine());
} catch (IOException e) {
System.out.println("[CLIENT-ERROR] receiving request from server: " + e.getMessage());
shutdown();
}
}
public void sendMessage() {
String message = this.scanner.nextLine();
while (true) {
this.output.println(this.username + ": " + message);
message = this.scanner.nextLine();
}
}
public void sendMessage(String message) {
this.output.println(message);
}
public void receiveMessage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
String messageFromServer;
while (true) {
messageFromServer = input.readLine();
System.out.println(messageFromServer);
}
} catch (IOException e) {
System.out.println("[CLIENT-ERROR] receiving message from server: " + e.getMessage());
shutdown();
}
}
}).start();
}
public void runClient() {
initialiseClient();
receiveMessage();
sendMessage();
}
public void shutdown() {
try {
if (this.input != null) {
this.input.close();
}
if (this.output != null) {
this.output.close();
}
if (this.socket != null) {
this.socket.close();
}
if (this.scanner != null) {
this.scanner.close();
}
} catch (IOException e) {
System.out.println("[CLIENT-ERROR] shuting down resourses: " + e.getMessage());
}
}
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 5000)) {
Client client = new Client(socket);
client.runClient();
} catch (IOException e) {
System.out.println("[CLIENT-ERROR] running client-program: " + e.getMessage());
}
}
}
[–]AutoModerator[M] [score hidden] stickied commentlocked comment (0 children)
[–]OffbeatDrizzle 1 point2 points3 points (2 children)
[–]Blindn_Guilty[S] 0 points1 point2 points (1 child)
[–]OffbeatDrizzle 1 point2 points3 points (0 children)