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.
- Rejestracja:prawie 8 lat
- Ostatnio:prawie 6 lat
- Postów:38

- Rejestracja:ponad 8 lat
- Ostatnio:4 minuty
- Lokalizacja:U krasnoludów - pod górą
- Postów:4709
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.
- Rejestracja:prawie 8 lat
- Ostatnio:prawie 6 lat
- Postów:38
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

- Rejestracja:ponad 8 lat
- Ostatnio:4 minuty
- Lokalizacja:U krasnoludów - pod górą
- Postów:4709
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
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.