Komunikator (zlozony z dwoch plikow)

0

Witam,
sluchajcie mam nastepujacy program, jest to komunikator sieciowy (mozliwosc sprawdzenia dzialania na wlasnym kompie). Sprawa wyglada tak ze wystepuje on w dwoch osobnych plikach, chce go polaczyc tak aby byl w jednym pliku i odpalal sie w jednym oknie. Program jest juz polaczony.. natomiast wystepuja 2 powazne bledy.. po pierwsze po wpisaniu komendy END i wcisnieciu SEND button ten (SEND) powinien sie wyszarzyc (i tak tez robi, aleee...) dla dwoch komputerow to dziala... dla 3ech juz nie.. cos namieszalem chyba w kodzie servera... gdyz jezeli wpisuje END na komp1 to komp2 wylacza komp3... czyli jest nie tak bo komp 1 powinen odlaczyc sie i na tym koniec... druga rzecz to to ze serwer przed polaczeniem programow zamyka sesje a po polaczeniu juz nie. Pomozcie poprawic owe bledy.

Oto kody:
PRZED POLACZENIEM:
FrameClientApp:

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

public class FrameClientApp extends JFrame 
{
    JLabel l1 = new JLabel("Server address :");
    JTextField text1 = new JTextField("127.0.0.1");
    JTextField text2 = new JTextField("Tekst do wyslania");
    JButton send = new JButton("Send");


    JMenuBar jMenuBar = new JMenuBar();
    JMenu jMenuFile = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();

    public static final int PORT = 8080;

    public FrameClientApp(String title)     
{
        super(title); 
        JPanel p = new JPanel(new GridLayout(2,2));
        send.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                sendInformation();
            }
        });
        

        p.add(l1);
        p.add(text1);
        p.add(text2);
        p.add(send);
        
        jMenuFile.setText("File");
        jMenuFileExit.setText("Exit");
        jMenuFile.add(jMenuFileExit);
        jMenuBar.add(jMenuFile);
        setJMenuBar(jMenuBar);
        jMenuFileExit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
        getContentPane().add(p);
        setSize(300, 100);
    }

    private void sendInformation()
    {
        try
        {
            InetAddress addr = InetAddress.getByName(text1.getText());
            System.out.println("addr = " + addr);
            Socket socket = new Socket(addr, PORT);
           
            try
            {
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println(text2.getText());
                String str = in.readLine();
                System.out.println(str);
                out.println("END");
            }
            finally 
            {
                System.out.println("closing...");
                socket.close();
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    public static void main(String[] args) throws IOException
    {
        System.out.println("Start Applikacji");
        FrameClientApp frame = new FrameClientApp("Client Application");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

FrameServerApp:

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


public class FrameServerApp extends JFrame // jframe bo chcemy miec okienko w programie z package swing
{
  JTextArea jTextArea = new JTextArea(1,1); //j text fild dziala tak samo jak area. roznia sie tym ze txt field mozna w jedym wierszu wpisywac info. a tutaj jest taki prosty edytor tekstu
  JMenuBar jMenuBar = new JMenuBar();
  JMenu jMenuFile = new JMenu();
  JMenuItem jMenuFileExit = new JMenuItem();
  //tworzenie menu takie jak w client
  
  
  Server server; //zmienna server klasy server //klasa wewnetrzna i jest ukryta we wnetrzu innej klasy
  public class Connection extends Thread
  {
    Socket socket;
    JTextArea textArea;
    Connection(Socket s, JTextArea ta)
    {
        socket = s;// zapamietuje pod swoimi zmiennymi
        textArea = ta;
    }

    void addText(String s)
    {
        textArea.setText(s + "\n" + textArea.getText());
    }

    public void run()
    {
        try
        {
            try
            {
                this.addText("------------------------------");
                this.addText("Connection accepted:" + socket);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//inn i out bo chcemy znim rozmawiac
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                while (true)
                {
                    String str = in.readLine();// za pomoca instrukcji readLine czytamy ta linie ktora przyslal klient
                    if ( str.equals("END"))//str jest obiektem
                    {
                        break;
                    }
                    this.addText("Text : " + str);
                    out.println(str);//odsy³a clientowi
                }
            }
            finally
            {
                this.addText("closing..."); //zamyka socket i obiekt connection umiera po wyjsciu z run
                socket.close();
            }
        }
        catch(IOException e)
        {
            ;
        }

    }
  }
//klasa wewnetrzna jest zdefiniowana wewnatrz innej klasy
//connetion i server
  public class Server extends Thread
  {
    public static final int PORT = 8080;
    JTextArea textArea;
    boolean working = true;
    Server(JTextArea ta)
    {
        textArea = ta;
    }

    void addText(String s)
    {
        textArea.setText(s + "\n" + textArea.getText());
    }

    public void end()
    {
        working = false;
    }

    public void run()//ponizej pêtelka ktora powoduje zatrzymanie watku w metoc\dzie run
    {
        while(working)//typu boolean true w petli siedzimy do konca
        {
            try //gadamy z klientem przez siec dlatego musi sie pojawic try i catch
            {
                ServerSocket s = new ServerSocket(PORT); //kreujemy server socket, specjalna odmiana, podaje si enr portu na kotrym jest otwarty. Server socket otwiera sie na wszystkim na czym sie da, wszytskjo co jest podlaczone do sieci.
                this.addText("Started: " + s);
                try
                {
                    Socket socket = s.accept();//wisi. akceptujemy polaczenie metoda accept//w wyniku tego powstaje obiek socket
                    Connection c = new Connection(socket, textArea);//na connection wola sie start. //te obiekty zyja tak dlugo ja trzyma ja metoda run
                    c.start();
                }
                finally
                {
                    s.close();//zamyklay server socket  
                    /*ServerSocket s - tak powinno si episac!!
                    while(true)
                    {s.accept}
                    {}s.close()*/
                }
            }
            catch(IOException e)
            {
                ; //!!!!!! tak nei pisaæ, musi byc rozwiazanie - cicha obsluga bledow chociaz system.out.println("na konsoli wyswietlic co sie stalo")
            }
        }
    }
  }

  public FrameServerApp()
  {
    try
    {
      jbInit();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
  public static void main(String[] args)
  {
    FrameServerApp frameServerApp = new FrameServerApp();
    frameServerApp.setVisible(true);
  }
  private void jbInit() throws Exception //jbInit traktujemy jak konstruktor
  {//tworze siemenu tak jak w cliencie
    jMenuFile.setText("File");
    jMenuFileExit.setText("Exit");
    jMenuFile.add(jMenuFileExit);
    jMenuBar.add(jMenuFile);
    this.setJMenuBar(jMenuBar);//end omawianie clienta
    jMenuFileExit.addActionListener(new ActionListener()//przy akcji na obeikcie server bedzie
    {
        public void actionPerformed(ActionEvent e)
        {
            server.end();
            System.exit(0);//bezzwloczne wyjscie programu w javie
        }
    });
    this.setDefaultCloseOperation(3); //krzyzykiem zamykajac okno zamykamy tez program (3)dlatego ze sun da³ dupy;]zapomnieli zdefiniowac tej stalej [exit_on_close] z ta trojka nie piszemy
    //this.getContentPane().setLayout(new GridLayout(2,1));
    this.getContentPane().setLayout(new BorderLayout()); //layout ustawiamy na border bo do centum wstawiamy jtextarea
    this.getContentPane().add(jTextArea, BorderLayout.CENTER);
    this.setSize(400,300);
    server = new Server(jTextArea); //kreujemy obiekt serwer //
    server.start();//server dziedziczy z thread
  }
}

PROGRAM PO POLACZENIU:

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

public class AplikacjaSerwera extends JFrame
{
    JTextArea jTextArea = new JTextArea(1,1);//obszar tekstu
    Server server;
    Socket socket;
    boolean conn=false;
    BufferedReader in;
    PrintWriter out;
    JMenuBar jMenuBar = new JMenuBar();
    JMenu jMenuFile = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();
    JLabel l1 = new JLabel("Server address:");
    JTextField text1 = new JTextField("127.0.0.1");
    JTextField text2 = new JTextField("Tu wpisz tekst");
    JButton send = new JButton("Send");
    JButton ConnButt = new JButton("Connect");
    public static final int PORT = 8080;
    
    public AplikacjaSerwera(String title)
    {
        super(title);
       JPanel p = new JPanel(new GridLayout(2,3));
       JPanel p2 = new JPanel(new GridLayout(3,1));
       send.setEnabled(false);
       send.addActionListener(new ActionListener()// kod obslugi zdarzen (wysyla)
        {
            public void actionPerformed(ActionEvent e)//przekazuje informacje za pomoca parametru 'e'
            {
                sendInformation();
            }
        });
        
        ConnButt.addActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent e){
                if (!conn) { //jesli nie polaczony 
                    connect();//polacz
                }
                else disconnect();
            }
        });
        
        p2.add(l1);
        p2.add(text1);
        p2.add(text2);
        p2.add(send);
        p2.add(ConnButt);
        p.add(jTextArea);
        p.add(p2);
        
        
        jMenuFile.setText("File");
        jMenuFileExit.setText("Quit");
        jMenuFile.add(jMenuFileExit);
        jMenuBar.add(jMenuFile);
        setJMenuBar(jMenuBar);
        jMenuFileExit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
        getContentPane().add(p);
        setSize(500, 400); 
        server = new Server(jTextArea);
        server.start();

    }
        
        
          private void connect()
    {
         try
        {
            InetAddress addr = InetAddress.getByName(text1.getText());
            System.out.println("addr = " + addr);
            socket = new Socket(addr, PORT); //kreuje fizyczne po³¹czenie do drugiej strony, tworzy siê obiekt Socket (IP i port)
            conn = true;
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                       
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            ConnButt.setText("Disconnect");
            send.setEnabled(true);
        }
        catch(IOException e)
        {
            System.out.println(e);//obs³uga b³êdu (wypisanie b³êdu)
            jTextArea.append("B³¹d po³¹czenia");
 
        }
        catch(Exception e)
        {
            System.out.println(e);
            jTextArea.append("B³¹d po³¹czenia");
        }
    }
        
    private void sendInformation()
    {
            try
            {
                out.println(text2.getText());
                String str = in.readLine();
                System.out.println(str);
            }
        catch(SocketException e)
        {
            System.out.println("B³¹d po³¹czenia");
            jTextArea.append("B³¹d po³¹czenia!\n");
            this.disconnect();
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
   
   private void disconnect()
    {
        try
        {
            out.println("END"); //dane o zakoñczeniu aplikacji dla programu.
            System.out.println("zamykanie..."); //zamkniecie po³aczenia
            socket.close();
            ConnButt.setText("Connect");
            conn=false;
            send.setEnabled(false);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
      public static void main(String[] args) throws IOException
    {
        System.out.println("Start Aplikacji");
        AplikacjaSerwera frame = new AplikacjaSerwera("GaduGadu2010");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//przy nacisniecium X zamyka okno
        frame.setVisible(true);
    }

 public class Connection extends Thread//klasa thread obsluguje 2-gi w¹tek
  {
    Socket socket;
    JTextArea textArea;
    Connection(Socket s, JTextArea ta)
    {
        socket = s;
        textArea = ta;
    }

    void addText(String s)
    {
        textArea.setText(s + "\n" + textArea.getText());
    }

    public void run()//2-gi watek znajduje sie w metodzie run -nie moze wyjsc
    {
        try
        {
            try
            {
                this.addText("------------------------------");
                this.addText("Connection accepted:" + socket);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                while (true)
                {
                    String str = in.readLine();
                    if ( str.equals("END"))//sprawdza czy nie jest 'END', nie rozlacza po przyjeciu
                    {
                        disconnect();
                        break;
                    }
                    this.addText("Text : " + str);
                    out.println(str);
                }
            }
            finally
            {
                this.addText("closing...");
                socket.close();
            }
        }
        catch(IOException e)
        {
            ;
        }

    }
  }

  public class Server extends Thread
  {
    public static final int PORT = 8080;
    JTextArea textArea;
    boolean working = true;
    Server(JTextArea ta)
    {
        textArea = ta;
    }

    void addText(String s)
    {
        textArea.setText(s + "\n" + textArea.getText());
    }

    public void end()
    {
        working = false;
    }

    public void run()
    {
        while(working)
        {
            try
            {
                ServerSocket s = new ServerSocket(PORT);
                this.addText("Started: " + s);
                try
                {
                    Socket socket = s.accept();
                    Connection c = new Connection(socket, textArea);
                    c.start();
                }
                finally
                {
                    s.close();
                }
            }
            catch(IOException e)
            {
                ;
            }
        }
    }
  }
}
       

Takze moze znajdzie sie osoba ktora pomoze i wyjasni w czym problem

0

Jak uruchomiasz wszystko "lokalnie" na jednej maszynie, to wszyscy będą wstanie podłączyć się tylko do jednego "serwera", a co by było gdybyś uruchomił wszystko na normalnej sieci to nie wiem, nie bardzo chce mi się zagłębiać w twój kod bo pomysł żeby każdy program był klientem i serwerem jest bez sensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1