JavaChat - finálny kód

Created: 2008-10-11 - 19:36

Ak si uz pozriete tento kod a chcete sa nim inspirovat, tak ho aspon zmente tak, aby nebolo mozne zistit povod ;-).

Trieda: JavaChatBackEnd


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sk.upjs.ics.s.javaChat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rapasoft
 */
public class JavaChatBackEnd implements ActionListener {

    /* Aktualny datumik a cas */
    public Calendar cas = Calendar.getInstance();

    /* Umiestnenie suborov (defaultne v tom istom adresari): */
    private String ludiaTXT = "/home/rapasoft/ludia.txt";
    private String spravyTXT = "/home/rapasoft/spravy.txt";
    /* prezyvka ucastnika */
    private File prezyvka;
    /* subory reprezentujuce ludi a spravy */
    private File ludia;
    private File spravy;
    /* pomocne docasne premenne */
    private long dlzkaSuboruLudia;
    private long dlzkaSuboruSpravy;
    private int cnt = 4;
    public ArrayList<String> prihlaseniLudia;
    private long naposledyMenene;
    /*RAF*/
    RandomAccessFile nahodnyPristupLudia;
    RandomAccessFile nahodnyPristupSpravy;

    public JavaChatBackEnd() {
        ludia = new File(ludiaTXT);
        spravy = new File(spravyTXT);
        prezyvka = new File("meno.txt");
        if (!prezyvka.exists()) {
            try {
                prezyvka.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(JavaChatBackEnd.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        try {
            nahodnyPristupLudia = new RandomAccessFile(ludia, "rw");
            dlzkaSuboruLudia = nahodnyPristupLudia.length();
            nahodnyPristupLudia.close();
            nahodnyPristupSpravy = new RandomAccessFile(spravy, "rw");
            dlzkaSuboruSpravy = nahodnyPristupSpravy.length();
            nahodnyPristupSpravy.close();
        } catch (IOException ex) {
            System.out.println("Subor sa nepodarilo vytvorit - presvedcte sa, ze mate prava na zapis");
        }
    }

    /**
     * Funkcia, ktora zastavi chat-klienta a odstrani uzivatela zo zoznamu
     */
    public void stopChat() {
        System.out.println("------- Dovidenia --------");
        prihlaseniLudia.clear();
        try {
            nahodnyPristupLudia = new RandomAccessFile(ludia, "r");
            nahodnyPristupLudia.seek(0);
            while (nahodnyPristupLudia.getFilePointer() != nahodnyPristupLudia.length()) {
                String precitanyRiadok = nahodnyPristupLudia.readUTF();
                prihlaseniLudia.add(precitanyRiadok);
            }
            nahodnyPristupLudia.close();
            ludia.delete();
            nahodnyPristupLudia = new RandomAccessFile(ludia, "rw");
            String meno = zistiMeno();
            for (Iterator<String> it = prihlaseniLudia.iterator(); it.hasNext();) {
                String string = it.next();
                if (string.substring(0, meno.length()).equals(meno)) {
                    it.remove();
                }
            }
            for (String string : prihlaseniLudia) {
                nahodnyPristupLudia.writeUTF(string);
            }
            dlzkaSuboruLudia = nahodnyPristupLudia.length();
            nahodnyPristupLudia.close();
            prezyvka.delete();
        } catch (IOException io) {
            System.out.println("Neocakavana chyba 0.");
        }
    }

    /**
     * Pravidelne kontroluje ci sa zmenil subor s prihlasenymi
     * ludmi - ak ano tak vypise zmenu.
     */
    public void checkRoom() {
        prihlaseniLudia = new ArrayList<String>();
        try {
            nahodnyPristupLudia = new RandomAccessFile(ludia, "r");
            if (naposledyMenene!=ludia.lastModified()) {
                nahodnyPristupLudia.seek(0);
                while (nahodnyPristupLudia.getFilePointer() != nahodnyPristupLudia.length()) {
                    String precitanyRiadok = nahodnyPristupLudia.readUTF();
                    prihlaseniLudia.add(precitanyRiadok);
                }
                dlzkaSuboruLudia = nahodnyPristupLudia.length();
                System.out.print("------- Prihlaseni ludia --------" +
                        "\n" + prihlaseniLudia.toString() +
                        "--------------------------------");
                System.out.println();
                naposledyMenene = ludia.lastModified();
            }
            nahodnyPristupLudia.close();
        } catch (IOException io) {
            System.out.println("Neocakavana chyba 1.");
        }
    }

    public String zistiMeno() {
        try {
            RandomAccessFile zapisMeno = new RandomAccessFile(prezyvka, "rw");
            zapisMeno.seek(0);
            String meno = zapisMeno.readUTF();
            zapisMeno.close();
            return meno;
        } catch (Exception ex) {
            System.out.println("Jedna z dalsich neocakavanych chyb");
        }
        return "";
    }

    public void getPeople() {
        prihlaseniLudia = new ArrayList<String>();
        try {
            nahodnyPristupLudia = new RandomAccessFile(ludia, "r");
            nahodnyPristupLudia.seek(0);
            while (nahodnyPristupLudia.getFilePointer() != nahodnyPristupLudia.length()) {
                String precitanyRiadok = nahodnyPristupLudia.readUTF();
                prihlaseniLudia.add(precitanyRiadok);
            }
            dlzkaSuboruLudia = nahodnyPristupLudia.length();
            System.out.print("------- Prihlaseni ludia --------" +
                        "\n" + prihlaseniLudia.toString() +
                        "--------------------------------");
            System.out.println();
            nahodnyPristupLudia.close();
        } catch (IOException io) {
            System.out.println("Neocakavana chyba 1.");
        }
    }

    /**
     * Funkcia login nacita zoznam uzivatelov zo suboru
     * a dopise prave prihlasujuceho sa uzivatela - ak sa
     * uz taky v zozname nachadza prida mu pred meno 
     * nejake cislo na rozlisenie
     */
    public void logIn(String nick) {
        try {
            nahodnyPristupLudia = new RandomAccessFile(ludia, "rw");
            prihlaseniLudia = new ArrayList<String>();
            nahodnyPristupLudia.seek(0);
            while (nahodnyPristupLudia.getFilePointer() != nahodnyPristupLudia.length()) {
                String precitanyRiadok = nahodnyPristupLudia.readUTF();
                prihlaseniLudia.add(precitanyRiadok);
            }
            for (String ludia : prihlaseniLudia) {
                if (ludia.substring(0, nick.length()).equals(nick)) {
                    nick = (int) (Math.random() * 999) + nick;
                    break;
                }
            }
            System.out.print("-------- Boli ste prihlaseny pod prezyvkou:" +
                    "--------- \n " + nick);
            System.out.println();
            prihlaseniLudia.add(nick + " " + cas.getTime() + "\n");
            nahodnyPristupLudia.writeUTF(nick + " " + cas.getTime() + "\n");
            dlzkaSuboruLudia = nahodnyPristupLudia.length();
            nahodnyPristupLudia.close();
            naposledyMenene = ludia.lastModified();
            RandomAccessFile zapisMeno = new RandomAccessFile(prezyvka, "rw");
            zapisMeno.writeUTF(nick);
            zapisMeno.close();
        } catch (IOException io) {
            System.out.println("Neocakavana chyba 2.");
        }
    }

    public void actionPerformed(ActionEvent arg0) {
        cas = Calendar.getInstance();
        cnt++;
        if (cnt == 5) {
            cnt = 0;
            this.checkRoom();
        }
        this.checkMsg();
    }

    /**
     * Metoda vracia poslednych niekolko sprav - posunie sa spät
     * o 1000 byteov (ak je subor mensi cita ho cely) precita riadok
     * (aby necital od polky riadku) a dalej uz cita klasicky poslednych
     * niekolko sprav (nemusi to byt presne 10)
     * @return poslednych 1000 byteov
     */
    public String readFirstTenMsg() {
        /*
         * Toto mi prislo rychlejsie a efektivnejsie ako citat cely
         * subor, ukladat riadky do nejakeho pola trebars
         * a potom len vypisovat poslednych 10 sprav...
         */
        try {
            nahodnyPristupSpravy = new RandomAccessFile(spravy, "r");
            if (nahodnyPristupSpravy.length() > 1000) {
                nahodnyPristupSpravy.seek(nahodnyPristupSpravy.length() - 1000); //trebars
                nahodnyPristupSpravy.readLine();
                System.out.println("------- Poslednych 10 sprav ------");
                while (nahodnyPristupSpravy.getFilePointer() != nahodnyPristupSpravy.length()) {
                    String sprava = nahodnyPristupSpravy.readUTF();
                    if (kohoSukromna(sprava).equals(zistiMeno())) {
                        //System.out.println("PMka: " + sprava);
                    } else if (kohoSukromna(sprava).equals("verejna")) {
                        System.out.println(sprava);
                    }
                    System.out.println("----------------------------------");
                    System.out.println();
                }
                dlzkaSuboruSpravy = nahodnyPristupSpravy.length();
                nahodnyPristupSpravy.close();
            } else {
                nahodnyPristupSpravy.seek(0);
                System.out.println("------- Poslednych 10 sprav ------");
                while (nahodnyPristupSpravy.getFilePointer() != nahodnyPristupSpravy.length()) {
                    String sprava = nahodnyPristupSpravy.readUTF();
                    if (kohoSukromna(sprava).equals(zistiMeno())) {
                        //System.out.println("PMka: " + sprava);
                    } else if (kohoSukromna(sprava).equals("verejna")) {
                        System.out.println(sprava);
                    }
                }
                System.out.println("----------------------------------");
                System.out.println();
                dlzkaSuboruSpravy = nahodnyPristupSpravy.length();
                nahodnyPristupSpravy.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("Neocakavana chyba 3.");
        }
        return "";
    }

    /**
     * Funkcia, ktora kontroluje prichadzajuce spravy
     * Ak je sprava sukromna, tak ju zobrazi len prijemcovi s danym nickom
     */
    private void checkMsg() {
        // TODO: Sukromne spravy prijmanie
        try {
            nahodnyPristupSpravy = new RandomAccessFile(spravy, "r");
            if (nahodnyPristupSpravy.length() != dlzkaSuboruSpravy) {
                nahodnyPristupSpravy.seek(dlzkaSuboruSpravy);
                String sprava = nahodnyPristupSpravy.readUTF();
                if (kohoSukromna(sprava).equals(zistiMeno())) {
                    System.out.println("PMka: " + sprava);
                    System.out.println();
                } else if (kohoSukromna(sprava).equals("verejna")) {
                    System.out.println(sprava);
                    System.out.println();
                }
                dlzkaSuboruSpravy = nahodnyPristupSpravy.length();
            }
            nahodnyPristupSpravy.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("Neocakavana chyba 4.");
        }
    }

    private String kohoSukromna(String sprava) {
        String parse = sprava.substring(17, sprava.length());
        StringTokenizer tok = new StringTokenizer(parse, " ", false);
        if (tok.countTokens() > 2) {
            String odKoho = tok.nextToken();
            String komu = tok.nextToken();
            if (tok.nextToken().equals("-")) {
                return komu;
            } else {
                return "verejna";
            }
        } else {
            return "verejna";
        }
    }

    /**
     * Metoda, ktora posiela spravu ziskanu zo vstupu
     * @param sprava - podporuje aj UTF znaky
     */
    public void sendMsg(String cas, String meno, String sprava) {
        try {
            nahodnyPristupSpravy = new RandomAccessFile(spravy, "rw");
            nahodnyPristupSpravy.seek(nahodnyPristupSpravy.length());
            nahodnyPristupSpravy.writeUTF(cas + " " + meno + " " + sprava);
            nahodnyPristupSpravy.close();
        } catch (IOException ex) {
            System.out.println("Neocakavana chyba 5.");
        }
    }

    public String now() {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("hh mm ss dd MM yy");
        return sdf.format(cal.getTime());

    }
}


Trieda: MainFrame

/*
 * MainFrame.java
 *
 * Created on Utorok, 2008, september 23, 21:22
 */
package sk.upjs.ics.s.javaChat;

import java.util.Calendar;
import java.util.Scanner;
import javax.swing.Timer;


/**
 *
 * @author  rapasoft
 */
public class MainFrame {

public static Timer casovac;
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {

        Calendar aktualnyDatumACas = Calendar.getInstance();
        casovac = new Timer(1000,new JavaChatBackEnd());
	casovac.start();
        JavaChatBackEnd motor = new JavaChatBackEnd();
        Scanner meno = new Scanner(System.in);
        System.out.print("------- Vitajte v JavaChate. --------" +
                "\n Prosim zvolte si prezyvku: ");
        System.out.println();
        String nick = meno.next();
        motor.logIn(nick);     
        motor.readFirstTenMsg();
        String vstup = "";
        while(!vstup.equals("end")){
            Scanner scanner = new Scanner(System.in);
            vstup = scanner.nextLine();
            //ukoncenie programu
            if(vstup.equals("end")){
                motor.stopChat();
                break;
            }
            //help
            else if(vstup.equals("help")){
                System.out.println("Vitajte v chatovacom systeme! \n" +
                        "Pre posielanie sprav piste do konzoly, ak chcete " +
                        "poslat sukromnu spravu napiste nick pouzivatela \n" +
                        "(zoznam aktualne prihlasenych je mozne ziskat " +
                        "prikazom 'ktojetu') medzera - ... napr.: \n" +
                        "PaloR - Toto je sukromna sprava ktoru nikto nevidi :)");
            }
            //vypisat zoznam ludi
            else if(vstup.equals("ktojetu")){
                motor.getPeople();
            }
            //posielanie sprav
            else{
                motor.sendMsg(motor.now(),motor.zistiMeno(),vstup);
            }
        }
        casovac.stop();
    }
}