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 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 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 (); 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 (); 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 (); 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(); } }