aplikacja jeden serwer - kilku klientow

0

hej.
Zwracam się do Was z pytaniem, co trzeba zrobić, żeby klient obsługiwał kilku klientów?
Mam ogólnie połączony klient z serwerem, wszystkie funkcje działają poprawnie. Funkcje serwera powinny być synchronizowane by uchronić je przed błędami.
Pytanie co dalej? Nigdzie nie spotkałem się z funkcją która "tworzy" inny obiekt typu "klient" który może komunikowac się z serwerem ani nigdzie nie znalazłem informacji jak takie połączenie ma sie odbywać? W takim razie co zrobić, by ze zwykłego programu klient -serwer zrobić kilku klientów - serwer? Bardzo proszę o w miarę proste wytłumaczenie.

0

Pytanie zbyt ogólne. Jak masz ogólnie połączony klient z serwerem - to nic nie musisz robić.
Lepiej pokaż/ opisz co dokładnie masz.

0

Wkleje wszystko po za bibliotekami i elementami swinga:
Klient\

package klasy;

 ///////////KLASA KLIENT////////////////////////////////////////////////////////
public  class Klient extends JFrame //implements ActionListener
{   JTextField IDedytuj;
    JTextField nazwaProd;
   JTextField producent;
    JTextField ID;
    JTextField cenaProd;
   // JButton magazyn;
    BufferedReader klawiatura;
    PrintWriter out;
    private Socket socketKlienta;
    private BufferedReader in;
    ObjectOutputStream OOS=null;
    ObjectInputStream OIS=null;
     Magazyn magKlient  = new Magazyn();
      String nazwaPliku="J:\\Pliczek.txt";
/////////////////KONSTRUKTOR////////////////////////////////////////////////////   
      
    
      Klient() {
        try {
        socketKlienta = new Socket("localhost", 2020);
        System.out.println("Klient dziala: ");
        } catch (IOException e) {
            System.out.println("Uruchom serwer: " + e);
            System.exit(1);
        }

    }
    ////////////////FUNKCJA MAIN////////////////////////////////////////////////
    public static void main(String[] args) throws Exception 
{  
    Klient okno = new Klient();    
    okno.init();   
    okno.setVisible(true);  
    okno.setLocationRelativeTo(null);
    okno.utworzStrumienie();
    okno.pack();
    
     
}
    ///////////////////FUNKCJE////////////////////////////////////////////////
     void utworzStrumienie() throws Exception
    {
        String messageFromServer = null;
        try
        {
            OIS = new ObjectInputStream(socketKlienta.getInputStream());
            OOS = new ObjectOutputStream(socketKlienta.getOutputStream());
            System.out.println("Strumienie utworzone");
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
 
    }
     //////////////////////////////////////////////////////////////////////////
    void pobierzMagazyn() 
    {
        String messageFromServer = null;
        try
        {   
            OOS.writeObject(1);
           /*Magazyn*/  magKlient =(Magazyn)OIS.readObject();
            magKlient.wyswietl();
        
        }
        catch(Exception e)
        {
            System.out.println("Blad funkcji pobierzMagazyn()!"+e);
        }       
    }
    ///////////////////////////////////////////////////////////////////////////
         void wyslijMagazyn()
    {
        String messageFromServer = null;
        try
        {   OOS.writeObject(2);
            OOS.writeObject(magKlient);
            System.out.println("wyslalem magazyn!");

        }
        catch(Exception e)
        {
            System.out.println("Blad funkcji wyslijMagazyn()!"+e);
        }       
       

    }

    }

     void dodajProdukt()
     {  System.out.println("funckcja dodaj produkt");
         
        String IdP=ID.getText();
         System.out.println("ID: "+IdP);
         
         String nazwa=nazwaProd.getText();
         System.out.println("nazwa produktu: "+nazwa);
         
         float cenaP=Float.parseFloat(cenaProd.getText());
         System.out.println("cena produktu: "+cenaP); 
         
         String produc=producent.getText();
         System.out.println("producent: "+produc);
         Towar t=new Towar(IdP,nazwa,cenaP,produc);
         
         
         magKlient.dodaj(t);
         
         magKlient.wyswietl();
     }
     void edytujProdukt()
     {
         System.out.println("funkcja edytuj produkt");
         String idPedytuj=IDedytuj.getText();
         
         System.out.println("edytujemy obiekt o ID "+idPedytuj);
          try
          {
              int indeks=magKlient.zwrocIndeks(idPedytuj);
               System.out.println("indeks ktorego szukales to "+indeks);
               String IdP=ID.getText();
         System.out.println("ID: "+IdP);
         
         String nazwa=nazwaProd.getText();
         System.out.println("nazwa produktu: "+nazwa);
         
         float cenaP=Float.parseFloat(cenaProd.getText());
         System.out.println("cena produktu: "+cenaP); 
         
         String produc=producent.getText();
         System.out.println("producent: "+produc);
         
         Towar t=new Towar(IdP,nazwa,cenaP,produc);
         magKlient.dodajZindeksem(t, indeks);
          }
          catch(Exception e)
          {
              
              

Klasa Serwer

package klasy;

public class Serwer {
    int serverPort = 2020;
    ServerSocket SerwerSoketSerwera;
    Socket socketDoKlienta;
   
    BufferedReader klawiatura;
    PrintWriter out;
    private BufferedReader in;
  Magazyn magSerw = new Magazyn();
  String nazwaPliku="J:\\Pliczek.txt";
    ////////////////////////////////////////////
    ObjectInputStream OIS=null;
    ObjectOutputStream OOS=null;
    
   /////////////////////////////////////////////// 
   
//Magazyn m1 = new Magazyn();

    /* Konstruktor próbuje utworzyć gniazdo */
    Serwer() {
        try {
           
            SerwerSoketSerwera = new ServerSocket(serverPort);
            System.out.println("Serwer dziala");
        } catch (IOException e) {
            System.out.println("Nie można utworzyć gniazda");
            System.exit(1);
        }
    }

    public static void main(String args[]) throws Exception {
        Serwer server = new Serwer();
        server.uruchom();
        //server.SerwerSoketSerwera.close();
    }

    void uruchom() throws Exception {
        socketDoKlienta = SerwerSoketSerwera.accept();
//////////////////////////////////////////////////////////////////////////////
OOS = new ObjectOutputStream(socketDoKlienta.getOutputStream());
OIS=new ObjectInputStream(socketDoKlienta.getInputStream());
while(true)
{
int o1 =(int)OIS.readObject();
        //System.out.println(o1);
        if(o1==1) //funkcja wysylajaca magazyn
        {
            System.out.println("Wysylam Magazyn");
            magSerw.odczytajPlik(nazwaPliku);
            OOS.writeObject(magSerw);
           
        }
            else
            if(o1==2)//funkcja odbierajaca magazyn
        {
                /*Magazyn*/ magSerw=(Magazyn)OIS.readObject();
                magSerw.dopiszPlik(nazwaPliku);
                System.out.println("odbieram magazyn!");
                magSerw.wyswietl();
        }
}


    }
}

Program na ogół działa, łączy się z jednym klientem, wszystkie funkcje działają. Pytanie tylko co zrobić, żeby można było uruchomić wielu klientów?
Myślałem że chodzi o utworzenie wątków oraz o synchronizacje pracy serwera ale nie jestem pewien ani nie bardzo wiem które funkcje w kliencie mają byc osobnymi wątkami

1

Problem nie jest w kliencie, a w serwerze.
A szczególnie chodzi o tą linijkę:
socketDoKlienta = SerwerSoketSerwera.accept();
To powinno być odpalane w osobnym wątku. Dla każdego klienta (jeden accept - jeden wątek).

Tylko musisz dużo poprawić w swoim kodzie, bo na wielowątkowy to się nie nadaje.
Ale przykładów w sieci jest dużo np.:
https://stackoverflow.com/questions/15541804/creating-the-serversocket-in-a-separate-thread

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