[java] chat

Viewer

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class ChatServer {
  7.     private ServerSocket serverSocket;
  8.     private List<ClientHandler> clients = new ArrayList<>();
  9.     private FileWriter historyFileWriter;
  10.  
  11.     public ChatServer(int port) throws IOException {
  12.         serverSocket = new ServerSocket(port);
  13.         historyFileWriter = new FileWriter("chat_history.txt"true);
  14.     }
  15.  
  16.     public void start() {
  17.         System.out.println("Server started. Waiting for clients...");
  18.  
  19.         while (true) {
  20.             try {
  21.                 Socket clientSocket = serverSocket.accept();
  22.                 System.out.println("New client connected: " + clientSocket);
  23.                 ClientHandler clientHandler = new ClientHandler(clientSocket);
  24.                 new Thread(clientHandler).start();
  25.             } catch (IOException e) {
  26.                 e.printStackTrace();
  27.             }
  28.         }
  29.     }
  30.  
  31.     private void broadcastUsers() {
  32.         StringBuilder userList = new StringBuilder("Users online: ");
  33.         for (ClientHandler client : clients) {
  34.             userList.append(client.getNick()).append(", ");
  35.         }
  36.         String userListMsg = userList.toString();
  37.         for (ClientHandler client : clients) {
  38.             client.sendMessage(userListMsg);
  39.         }
  40.     }
  41.  
  42.     // broadcast ogólny do klientów
  43.     private void broadcastMessage(String message) {
  44.         for (ClientHandler client : clients) {
  45.             client.sendMessage(message);
  46.         }
  47.         try {
  48.             historyFileWriter.write(message + "\n");
  49.             historyFileWriter.flush();
  50.         } catch (IOException e) {
  51.             e.printStackTrace();
  52.         }
  53.     }
  54.  
  55.     //
  56.     private class ClientHandler implements Runnable {
  57.         private Socket clientSocket;
  58.         private PrintWriter out; // streams
  59.         private BufferedReader in; // streams
  60.         private String nick;
  61.  
  62.         public ClientHandler(Socket socket) {
  63.             this.clientSocket = socket;
  64.             try {
  65.                 out = new PrintWriter(clientSocket.getOutputStream()true); // Inicjalizacja strumienia wyjściowego
  66.                 in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // Inicjalizacja strumienia wejściowego
  67.             } catch (IOException e) {
  68.                 e.printStackTrace();
  69.             }
  70.         }
  71.  
  72.         // thread głowny
  73.         public void run() {
  74.             try {
  75.                 out.println("Enter your username:");
  76.                 String username = in.readLine();
  77.                 out.println("Enter your password:");
  78.                 String password = in.readLine();
  79.  
  80.                 if (authenticate(username, password)) {
  81.                     nick = username;
  82.                     out.println("Welcome to the chat, " + nick + "!");
  83.                     clients.add(this);
  84.                     broadcastUsers();
  85.  
  86.                     String inputLine;
  87.                     while ((inputLine = in.readLine()) != null) {
  88.                         System.out.println(nick + ": " + inputLine);
  89.  
  90.                         if (inputLine.equalsIgnoreCase("exit")) {
  91.                             break;
  92.                         }
  93.  
  94.                         broadcastMessage(nick + ": " + inputLine); // brdcst wlasniwy
  95.                     }
  96.  
  97.                     clients.remove(this); // po koncu sesji
  98.                     broadcastUsers();
  99.                 } else {
  100.                     out.println("Authentication failed. Incorrect username or password.");
  101.                 }
  102.  
  103.                 in.close(); //bezpiecznik przed obsługą wyj
  104.                 out.close(); //
  105.                 clientSocket.close(); //
  106.             } catch (IOException e) {
  107.                 e.printStackTrace();
  108.             }
  109.         }
  110.  
  111.         public void sendMessage(String message) {
  112.             out.println(message);
  113.         }
  114.  
  115.         public String getNick() {
  116.             return nick;
  117.         }
  118.  
  119.         private boolean authenticate(String username, String password) {
  120.             try (BufferedReader br = new BufferedReader(new FileReader("users.txt"))) {
  121.                 String line;
  122.                 while ((line = br.readLine()) != null) {
  123.                     String[] parts = line.split(":");
  124.                     if (parts.length == 2 && parts[0].equals(username) && parts[1].equals(password)) {
  125.                         return true; // jesli passy ok
  126.                     }
  127.                 }
  128.             } catch (IOException e) {
  129.                 e.printStackTrace();
  130.             }
  131.             return false; // nok
  132.         }
  133.     }
  134.  
  135.     // MAIN MAIN MAIN
  136.     public static void main(String[] args) {
  137.         int portNumber = 12345; // 12233
  138.  
  139.         try {
  140.             ChatServer server = new ChatServer(portNumber);
  141.             server.start();
  142.         } catch (IOException e) {
  143.             System.err.println("Error starting the server on port " + portNumber);
  144.             e.printStackTrace();
  145.         }
  146.     }
  147. }

Editor

You can edit this paste and save as new:


File Description
  • chat
  • Paste Code
  • 24 Apr-2024
  • 4.99 Kb
You can Share it: