Witajcie,

Jestem w trakcie nauki javy. Stawiam pierwsze kroki w samodzielnym pisaniu programu. Zaczynam powoli łapać zasady programowania obiektowego. Chciałbym podzielić się z Wami kodem, który działa ale jestem pewien, że jest w nim sporo błędów i sprzeczności z programowaniem obiektowym. Jest to klient, który łączy się z serwerem w celu wysyłania komunikatów. W tej chwili nasuwa mi się pytanie czy fragment programu odpowiadający za nawiązywanie połączenia z serwerem nie powinien być zdefiniowany jako klasa a nie jako metoda.

Druga sprawa, czy wysyłanie informacji kontrolnej do serwera tzw. Heartbeat może być zrealizowany na takiej zasadzie czy stosuje się inne opcje niż jakiś tam string...

Dopracować muszę jeszcze kwestie wczytywania z pliku tekstowego opcji konfiguracyjnych...
Na pewno skopaną mam kwestię nawiązywania połączenia z serwerem, chciałem wprowadzić możliwość nawiązywania ponownego połączenia w razie niemożności połączenia się z serwerem, działa ale nie do końca dobrze... trzeba wprowadzić tam pętlę while w której będzie nawiązywane połączenie.

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

public class KlientWiadomosci {

  JTextArea odebraneWiadomosci;
  JTextField wiadomosc;
  BufferedReader czytelnik;
  PrintWriter pisarz;
  Socket gniazdo;
  String AdresSerwera = "192.168.0.13";
  String MojaNazwa;
  ArrayList<String[]> as;

  public static void main(String[] args) {
    KlientWiadomosci klient = new KlientWiadomosci();
    klient.doDziela();
  }

  public void doDziela() {
 
        try {
        File opcjePlik = new File("Settings.txt");
        FileReader czytelnikF = new FileReader(opcjePlik);
        BufferedReader czytelnik = new BufferedReader(czytelnikF);
        String wiersz;
        
        while ((wiersz = czytelnik.readLine()) != null) {
            // System.out.println(wiersz);
            as = new ArrayList<String[]>();
            String[] sa = new String[1];
            sa = wiersz.split("=");
            as.add(sa);
        }
        czytelnik.close();
    } catch (Exception zd) {
        zd.printStackTrace();
    } 
        
    // utworzenie graficznego interfejsu
    JFrame ramka = new JFrame("Klient");
    JPanel panelGlowny = new JPanel();

    odebraneWiadomosci = new JTextArea(15,35);
    odebraneWiadomosci.setLineWrap(true);
    odebraneWiadomosci.setWrapStyleWord(true);
    odebraneWiadomosci.setEditable(false);

    JScrollPane przewijanie = new JScrollPane(odebraneWiadomosci);
    przewijanie.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    przewijanie.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

    wiadomosc = new JTextField(20);

    JButton przyciskWyslij = new JButton("Wyślij");
    przyciskWyslij.addActionListener(new PrzyciskWyslijListener());

    panelGlowny.add(przewijanie);
    panelGlowny.add(wiadomosc);
    panelGlowny.add(przyciskWyslij);

    konfigurujKomunikacje();
    Thread watekOdbiorcy = new Thread(new OdbiorcaKomunikatow());
    watekOdbiorcy.start();

    ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);
    ramka.setDefaultCloseOperation(ramka.EXIT_ON_CLOSE);
    ramka.setSize(440,330);
    ramka.setVisible(true);
  } // koniec metody

  private void konfigurujKomunikacje() {
    try {
      
      String[] AdresSerwera2 = as.get(0);
      if (AdresSerwera2[0].equals("AdresSerwera")) {
          AdresSerwera = AdresSerwera2[1];
      }    
      gniazdo = new Socket(AdresSerwera, 5000);
      InputStreamReader czytelnikStrm = new InputStreamReader(gniazdo.getInputStream());
      czytelnik = new BufferedReader(czytelnikStrm);
      pisarz = new PrintWriter(gniazdo.getOutputStream());

      System.out.println("Obsługa sieci gotowa!");
      // Wysyłam informację z nazwą hosta i pingpong
      InetAddress remoteAddr = (InetAddress)gniazdo.getLocalAddress();
      String remoteAddrId = remoteAddr.getLocalHost().getHostName();
      pisarz.println("pingpong:" + remoteAddrId);
      pisarz.flush();  
      
    } catch(IOException ex) {
      // ex.printStackTrace();
      System.out.println("Nie mogę się połącyć!!!");
      try {
          Thread.sleep(2000);
      } catch (InterruptedException exx) {
          // exx.printStackTrace();
      }
      System.out.println("Próbuję nawiązać połączenie ponownie!!!");
      konfigurujKomunikacje();
    }
    Thread f = new Thread(new HeartBeat());
    f.start();
  } // koniec metody
  
  // metoda wysyłająca co 30s informację o tym że klient żyje ;)
  public class HeartBeat implements Runnable {
      
      public void run() {
        try {
            while(true) {
                
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException exx) {
                    // exx.printStackTrace();
                }
                InetAddress remoteAddr = (InetAddress)gniazdo.getLocalAddress();
                String remoteAddrId = remoteAddr.getLocalHost().getHostName();
                pisarz.println("pingpong:" + remoteAddrId);
                pisarz.flush();  
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }  
      }
  }
   
  public class PrzyciskWyslijListener implements ActionListener {
    public void actionPerformed(ActionEvent ev) {
      try {
         pisarz.println(wiadomosc.getText());
         pisarz.flush();

      } catch(Exception ex) {
         ex.printStackTrace();
      }
      odebraneWiadomosci.append(wiadomosc.getText());
      wiadomosc.setText("");
      wiadomosc.requestFocus();
    }
  }  

  public class OdbiorcaKomunikatow implements Runnable {
    public void run() {
      String wiadom;
      try {
        while ((wiadom = czytelnik.readLine()) != null) {
          System.out.println("Odczytano: " + wiadom);
          odebraneWiadomosci.append(wiadom + "\n");
          JOptionPane.showMessageDialog(null, wiadom);
        } // konic while
      } catch(Exception ex) {
        ex.printStackTrace();
        konfigurujKomunikacje();
        
      }
    } // konie metody run()
  } 
}