Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package pl.umk.mat.grzegorz72;
  2.  
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.io.BufferedReader;
  6. import java.io.InputStreamReader;
  7. import java.io.PrintWriter;
  8. import java.net.Socket;
  9. import java.util.ArrayList;
  10. import javax.swing.*;
  11.  
  12. public class Klient extends JFrame {
  13.  
  14.     private JTextArea tablicaCzata;
  15.     private JTextField komunikat;
  16.     private JTextField uzytkownikTx;
  17.  
  18.     /* nazwa użytkownika, adres*/
  19.     String uzytkownik;
  20.     String adres = "localhost";
  21.     /* lista użytkowników czata */
  22.     ArrayList<String> listaUzytkownikow = new ArrayList();
  23.     /* nr portu, na którym działą czat */
  24.     int port = 9090;
  25.     /* wskaźnik, czy klient jest połączny z czatem */
  26.     Boolean czyPolaczony = false;
  27.  
  28.     /* dniazdo, mechanizmy czytania i pisania */
  29.     Socket gniazdo;
  30.     BufferedReader czytaj;
  31.     PrintWriter pisz;
  32.  
  33.     public void sluchaj() {
  34.         Thread Pisanie = new Thread(new Pisanie());
  35.         Pisanie.start();
  36.     }
  37.  
  38.     /* dodawanie użytkownika do listy */
  39.     public void dodajUzytkownika(String dane) {
  40.         listaUzytkownikow.add(dane);
  41.     }
  42.  
  43.     /* usuwanie użytkownika z listy */
  44.     public void usunUzytkownika(String dane) {
  45.         tablicaCzata.append(dane + " wyszedł z czata. \n");
  46.     }
  47.  
  48.     public void writeUsers() { //nazwa moze ulec zmianie
  49.         String[] tymczasowaLista = new String[listaUzytkownikow.size()];
  50.         listaUzytkownikow.toArray(tymczasowaLista);
  51.         for (String token : tymczasowaLista) {
  52.             //listaUzytkownikow.append(token + "\n");
  53.         }
  54.     }
  55.  
  56.     /* wysyłanie informacji o rozłączeniu użytkownika z czatem */
  57.     public void wyslijRozlacz() {
  58.         String pozegnanie = (uzytkownik + ": rozłączył się");
  59.         try {
  60.             pisz.println(pozegnanie);
  61.             pisz.flush();
  62.         } catch (Exception e) {
  63.             tablicaCzata.append("Nie udało się wysłać informacji o rozłączeniu \n");
  64.         }
  65.     }
  66.  
  67.     /* rzeczywiste rozłączenie się użytkownika */
  68.     public void rozlacz() {
  69.         try {
  70.             tablicaCzata.append("Rozłączono.\n");
  71.             gniazdo.close();
  72.         } catch (Exception e) {
  73.             tablicaCzata.append("Nie udało się rozłączyć.\n");
  74.         }
  75.         czyPolaczony = false;
  76.         uzytkownikTx.setEditable(true);
  77.     }
  78.  
  79.     /* konstruktor klasy */
  80.     public Klient() {
  81.         zbudujOkno();
  82.     }
  83.  
  84.     /* w zależności od tego, jakie polecenie zostanie przekazane, będą wykonywane
  85.     różne operacje */
  86.  
  87.     public class Pisanie implements Runnable {
  88.         @Override
  89.         public void run() {
  90.             String[] dane;
  91.             String strumien;
  92.             String gotowe = "Gotowe";
  93.             String polaczono = "Połączono";
  94.             String rozlaczono = "Rozłączono";
  95.             String czat = "Czat";
  96.             try {
  97.                 while ((strumien = czytaj.readLine()) != null) {
  98.                     dane = strumien.split(":");
  99.                     if (dane[2].equals(czat)) {
  100.                         tablicaCzata.append(dane[0] + ":" + dane[1] + "\n");
  101.                         tablicaCzata.setCaretPosition(tablicaCzata.getDocument().getLength());
  102.                     }
  103.                     else if (dane[2].equals(polaczono)) {
  104.                         tablicaCzata.removeAll();
  105.                         dodajUzytkownika(dane[0]);
  106.                     }
  107.                     else if (dane[2].equals(rozlaczono)) {
  108.                         usunUzytkownika(dane[0]);
  109.                     }
  110.                     else if (dane[2].equals(gotowe)) {
  111.                         writeUsers();
  112.                         listaUzytkownikow.clear();
  113.                     }
  114.                 }
  115.             } catch (Exception e) { }
  116.         }
  117.     }
  118.  
  119.     /* metoda budująca okno czata */
  120.     private void zbudujOkno() {
  121.         /* deklarowanie elementów okna */
  122.         JLabel adresLb = new JLabel();
  123.         JTextField adresTx = new JTextField();
  124.         JLabel portLb = new JLabel();
  125.         JTextField portTx = new JTextField();
  126.         JLabel uzytkownikLb = new JLabel();
  127.         uzytkownikTx = new JTextField();
  128.         /* pola okna */
  129.         JButton polaczPrz = new JButton();
  130.         JButton rozlaczPrz = new JButton();
  131.         JScrollPane panelPrzewijany = new JScrollPane();
  132.         tablicaCzata = new JTextArea();
  133.         komunikat = new JTextField();
  134.         JButton wyslijPrz = new JButton();
  135.  
  136.         setDefaultCloseOperation(EXIT_ON_CLOSE);
  137.         setTitle("Czat - klient");
  138.         setName("klient");
  139.         setResizable(false);
  140.  
  141.         /* zadeklarowanie zdarzeń związanych z kliknięciem określonych obiektów */
  142.         adresLb.setText("Adres:");
  143.         adresTx.setText("localhost");
  144.         adresTx.addActionListener(e -> {
  145.             //tu ma byc definiowana akcja dla tego pola
  146.         });
  147.  
  148.         portLb.setText("Nr portu:");
  149.         portTx.setText("9090");
  150.         portTx.addActionListener(this::portAkcja);
  151.  
  152.         uzytkownikLb.setText("Użytkownik:");
  153.         uzytkownikTx.addActionListener(this::uzytkownikAkcja);
  154.  
  155.         polaczPrz.setText("Połącz");
  156.         polaczPrz.addActionListener(this::polaczAkcja);
  157.  
  158.         rozlaczPrz.setText("Rozłącz");
  159.         rozlaczPrz.addActionListener(this::rozlaczAkcja);
  160.  
  161.         /*rozmiar pola podglądu rozmów na czacie */
  162.         tablicaCzata.setColumns(25);
  163.         tablicaCzata.setRows(8);
  164.         panelPrzewijany.setViewportView(tablicaCzata);
  165.  
  166.         wyslijPrz.setText("Wyślij");
  167.         wyslijPrz.addActionListener(this::wyslijAkcja);
  168.  
  169.         /* ustawienie elementów okna */
  170.         GroupLayout layout = new GroupLayout((getContentPane()));
  171.  
  172.         getContentPane().setLayout(layout);
  173.         layout.setHorizontalGroup(
  174.                 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  175.                         .addGroup(layout.createSequentialGroup()
  176.                                 .addContainerGap()
  177.  
  178.                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  179.                                         .addGroup(layout.createSequentialGroup()
  180.                                                 .addComponent(komunikat, javax.swing.GroupLayout.PREFERRED_SIZE, 352, javax.swing.GroupLayout.PREFERRED_SIZE)
  181.                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  182.                                                 .addComponent(wyslijPrz, javax.swing.GroupLayout.DEFAULT_SIZE, 111, Short.MAX_VALUE))
  183.                                         .addComponent(panelPrzewijany)
  184.                                         .addGroup(layout.createSequentialGroup()
  185.                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
  186.                                                         .addComponent(uzytkownikLb, javax.swing.GroupLayout.DEFAULT_SIZE, 62, Short.MAX_VALUE)
  187.                                                         .addComponent(adresLb, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  188.                                                 .addGap(18, 18, 18)
  189.                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
  190.                                                         .addComponent(adresTx, javax.swing.GroupLayout.DEFAULT_SIZE, 89, Short.MAX_VALUE)
  191.                                                         .addComponent(uzytkownikTx))
  192.                                                 .addGap(18, 18, 18)
  193.                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
  194.                                                         .addComponent(portLb, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
  195.                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
  196.                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
  197.                                                         .addComponent(portTx, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE))
  198.                                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  199.                                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  200.                                                         .addGroup(layout.createSequentialGroup()
  201.                                                                 .addComponent(polaczPrz)
  202.                                                                 .addGap(2, 2, 2)
  203.                                                                 .addComponent(rozlaczPrz)
  204.                                                                 .addGap(0, 0, Short.MAX_VALUE))
  205.                                                 )))
  206.                                 .addContainerGap())
  207.                         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
  208.                                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
  209.                                 .addGap(201, 201, 201))
  210.         );
  211.  
  212.         layout.setVerticalGroup(
  213.                 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  214.                         .addGroup(layout.createSequentialGroup()
  215.                                 .addContainerGap()
  216.                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  217.                                         .addComponent(adresLb)
  218.                                         .addComponent(adresTx, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  219.                                         .addComponent(portLb)
  220.                                         .addComponent(portTx, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
  221.                                 )
  222.                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
  223.                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
  224.                                         .addComponent(uzytkownikTx)
  225.  
  226.                                         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
  227.                                                 .addComponent(uzytkownikLb)
  228.                                                 .addComponent(polaczPrz)
  229.                                                 .addComponent(rozlaczPrz)))
  230.                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
  231.                                 .addComponent(panelPrzewijany, javax.swing.GroupLayout.PREFERRED_SIZE, 310, javax.swing.GroupLayout.PREFERRED_SIZE)
  232.                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
  233.                                 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
  234.                                         .addComponent(komunikat)
  235.                                         .addComponent(wyslijPrz, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE))
  236.                                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
  237.                         )
  238.         );
  239.         pack();
  240.     }
  241.  
  242.     /* określenie akcji */
  243.     private void adresAkcja(ActionEvent evt) {
  244.  
  245.     }
  246.  
  247.     private void portAkcja(ActionEvent evt) {
  248.  
  249.     }
  250.  
  251.     private void uzytkownikAkcja(ActionEvent evt) {
  252.  
  253.     }
  254.  
  255.     private void polaczAkcja(ActionEvent evt) {
  256.         if (!czyPolaczony) {
  257.             uzytkownik = uzytkownikTx.getText();
  258.             uzytkownikTx.setEditable(false);
  259.             try {
  260.                 gniazdo = new Socket(adres, port);
  261.                 InputStreamReader czytajStrumien = new InputStreamReader(gniazdo.getInputStream());
  262.                 czytaj = new BufferedReader(czytajStrumien);
  263.                 pisz = new PrintWriter(gniazdo.getOutputStream());
  264.                 pisz.println(uzytkownik + " połączył się z czatem.");
  265.                 pisz.flush();
  266.                 czyPolaczony = true;
  267.             } catch (Exception e) {
  268.                 tablicaCzata.append("Nieudane połączenie! Spróbuj ponownie. \n");
  269.                 uzytkownikTx.setEditable(true);
  270.             }
  271.             sluchaj();
  272.         } else tablicaCzata.append("Jesteś już połączony \n");
  273.     }
  274.  
  275.     private void rozlaczAkcja(ActionEvent evt) {
  276.         wyslijRozlacz();
  277.         rozlacz();
  278.     }
  279.  
  280.     private void wyslijAkcja(ActionEvent evt) {
  281.         String nic = "";
  282.         if ((komunikat.getText()).equals(nic)) {
  283.             komunikat.setText("");
  284.             komunikat.requestFocus();
  285.         } else {
  286.             try {
  287.                 pisz.println(uzytkownik + ": " + komunikat.getText() + ":" + "Chat");
  288.                 pisz.flush();
  289.             } catch (Exception e) {
  290.                 tablicaCzata.append("Nie wysłano wiadomości. \n");
  291.             }
  292.             komunikat.setText("");
  293.             komunikat.requestFocus();
  294.         }
  295.         komunikat.setText("");
  296.         komunikat.requestFocus();
  297.     }
  298.  
  299.  
  300.     public static void main(String args[]) {
  301.         EventQueue.invokeLater(() -> new Klient().setVisible(true));
  302.     }
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement