2 rodzaje klientów - server (odróżenienie klientów) || proszę o pomoc

0

Witam
Potrzebuję stworzyć aplikację gdzie będzie serwer oraz 2 klasy klientów (producenci i konsumenci - w teorii nieograniczona liczba tych i tych).
Będą również potrzebne 2 zmienne: produkcja i konsumpcja.

Mój problem polega na tym, że nie mam pojęcia jak odróżnić klientówProducentów od klientówKonsumentów na serwerze, tak aby wpisana produkcja/konumpcja przez tych klientów mogła być przypisana do danej zmiennej produkcja lub konsumpcja (wpisana przez klientów produkcja/konsumpcja ma się sumować na serwerze do danej zmiennej)

Mam nadzieję że jest zrozumiałe o co mi chodzi.

Na razie mam coś takiego:

Klasa ServerCommunicationThread

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerCommunicationThread extends Thread{

    private Socket clientSocket;
    
    public ServerCommunicationThread(Socket clientSocket)
    {
        this.clientSocket = clientSocket;
    }
    
    int produckja =0;
    int konsumpcja =0;
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            System.out.println("SERVER: IN and OUT streams opened. Starting receiving data...");

            out.println("Witamy na serwerze.");
            out.flush();
            
        
            
            String inputLine;
            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
            
            while ((inputLine = in.readLine()) != null) {
                    
                if (inputLine.equals("koniec"))
                    break;
                else if (inputLine.equals("Producent")){
                    out.println("Podaj wielkosc/czestotliwosc PRODUKCJI");
                }
                else if (inputLine.equals("Konsument")){
                    out.println("Podaj wielkosc/czestotliwosc KONSUMPCJI");
                }
            
            }
            System.out.println("SERVER: Ending sequence received. Closing streams and sockets.");
            out.close();
            in.close();
            clientSocket.close();
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }

    }

} 

Klasa Server


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) {
        
        while (true)
        {
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(4444);
            } catch (IOException e) {
                System.err.println("SERVER: Could not listen on port: 4444, " + e);
                System.exit(1);
            }
            System.out.println("SERVER: Server connection opened on port 4444.");
    
            Socket clientSocket = null;
            try {
                // after this method server stops and waits for new client connection
                clientSocket = serverSocket.accept();
                serverSocket.close();
            } catch (IOException e) {
                System.err.println("SERVER: Accept failed: 4444, " + e);
                System.exit(1);
            }
            System.out.println("SERVER: Accepted client connecion on port 4444.");
    
            ServerCommunicationThread thread = new ServerCommunicationThread(clientSocket);
            thread.start();
        }

    }

}

Klasa Producer

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Producer {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 4444);
            System.out.println("CLIENT: Server connected on port 4444");
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("CLIENT: IN and OUT streams opened. Starting sending data...");
            
            String producentInput, serverResponse;
            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
            
            while ((serverResponse = in.readLine()) != null) {
                
                if(serverResponse.equals("Witamy na serwerze.")){
                    producentInput = "Producent";
                    out.println(producentInput);
                    out.flush();
                }
                
                else {
                System.out.println("Server: " +serverResponse);
                System.out.print("Producent: ");
                producentInput = console.readLine();
                out.println(producentInput);
                out.flush();
                
                if (producentInput.equals("koniec")) {
                    break;
                }
                }
            } 

            System.out.println("CLIENT: Ending server connection. Closing client streams and socket.");
            out.close();
            in.close();
            socket.close();
            System.exit(0);
        } catch (UnknownHostException e) {
            System.err.println("CLIENT: Trying to connect to unknown host: " + e);
            System.exit(1);
        } catch (Exception e) {
            System.err.println("CLIENT: Exception:  " + e);
            System.exit(1);
        }

    }

}

Klasa Consumer

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Consumer {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 4444);
            System.out.println("CLIENT: Server connected on port 4444");
            
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("CLIENT: IN and OUT streams opened. Starting sending data...");
            
            String klientInput="Konsument";
            String serverResponse;
            int test = 0;
            BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
            
            while ((serverResponse = in.readLine()) != null) {
                
                if(serverResponse.equals("Witamy na serwerze.")){
                    klientInput = "Konsument";
                    out.println(klientInput);
                    out.flush();
                }
                
                else {
                System.out.println("Server: " +serverResponse);
                System.out.print("Klient: ");
                klientInput = console.readLine();
                out.println(klientInput);
                out.flush();
                
                if (klientInput.equals("koniec")) {
                    break;
                }
                }
            } 

            System.out.println("CLIENT: Ending server connection. Closing client streams and socket.");
            out.close();
            in.close();
            socket.close();
            System.exit(0);
        } catch (UnknownHostException e) {
            System.err.println("CLIENT: Trying to connect to unknown host: " + e);
            System.exit(1);
        } catch (Exception e) {
            System.err.println("CLIENT: Exception:  " + e);
            System.exit(1);
        }

    }

}
0

Znajdzie się ktoś kto jest w stanie pomóc, albo chociaż naprowadzić ?

0

Przy połączeniu od razu klient powinien wysłać informacje np.

out.println("jestem producentem");
out.flush();

A serwer odebrać i na jej podstawie dodać do bazy konsumenta lub producenta:

         a = strumienIN.readLine();
         if(a.endsWith("konsumentem")){
             //klient jest konsumentem
         }else if(a.endsWith("prodeucentem")){
             //klient jest producentem
         }

Mam nadzieje że dobrze cie zrozumiałem ;).

0

Mam nadzieję że jest zrozumiałe o co mi chodzi.

W ogóle nie jest zrozumiałe. Co więcej, ty chyba nie za bardzo rozumiesz co robisz, bo ten kod to jakiś WTF.

  1. Czemu zamykasz ServerSocket i otwierasz ponownie po podłączeniu klienta? Rozumiesz że server socket może akceptować wielu klientów bo accept zwraca nowy socket?
  2. Ten twój pomysł z sumowaniem nie ma prawa działać, przynajmniej nie tak jak to zaimplementowałeś bo przecież dla każdego klienta tworzysz NOWY wątek obsługi. W efekcie każdy wątek ma SWOJE WŁASNE pola "produkcja" i "konsumpcja". Po podłączeniu 2 klientów będziesz miał 2 osobne wątki.
  3. Nie rozumiem twojego pytania o "rozróżnianie" producenta od konsumenta skoro widzę w kodzie że klient wysyła informacje o tym "kim" jest.
0
Shalom napisał(a):

Mam nadzieję że jest zrozumiałe o co mi chodzi.

W ogóle nie jest zrozumiałe. Co więcej, ty chyba nie za bardzo rozumiesz co robisz, bo ten kod to jakiś WTF.

  1. Czemu zamykasz ServerSocket i otwierasz ponownie po podłączeniu klienta? Rozumiesz że server socket może akceptować wielu klientów bo accept zwraca nowy socket?
  2. Ten twój pomysł z sumowaniem nie ma prawa działać, przynajmniej nie tak jak to zaimplementowałeś bo przecież dla każdego klienta tworzysz NOWY wątek obsługi. W efekcie każdy wątek ma SWOJE WŁASNE pola "produkcja" i "konsumpcja". Po podłączeniu 2 klientów będziesz miał 2 osobne wątki.
  3. Nie rozumiem twojego pytania o "rozróżnianie" producenta od konsumenta skoro widzę w kodzie że klient wysyła informacje o tym "kim" jest.
  1. Niestety kompletnie nie znam się na programowaniu. Podobny kod do aplikacji klient-server miałem na zajęciach i muszę go przerobić w jakiś sposób.

2. Właśnie z tym co piszesz mam teraz problem. Po podłączeniu klientów są 2 osobne wątki i się nie sumuje do jednej zmiennej.
Co więc powinienem zrobić w takim przypadku ? Co muszę zmienić, aby wielu klientów mogło łączyć się do jednego wątku?

0
  1. Super, ale przerabiaj używając mózgu a nie klepiąc bezmyślnie.
  2. Jw., musisz zacząć myśleć i rozumieć co piszesz, inaczej się nie da. Odradzałbym podłączanie wielu klientów do jednego wątku bo wtedy nie zamodelujesz producentów/konsumentów. Musisz tą swoją "produkcje"/"konsumpcję" wyciągnąć "ponad" wątek do jakiegoś innego obiektu i ten obiekt przekazywać w konstruktorze do swoich wątków. Weź tylko pod uwagę że wtedy dostęp do tego obiektu / do jego pól i metod będziesz musiał synchronizować!
0
Shalom napisał(a):
  1. Super, ale przerabiaj używając mózgu a nie klepiąc bezmyślnie.
  2. Jw., musisz zacząć myśleć i rozumieć co piszesz, inaczej się nie da. Odradzałbym podłączanie wielu klientów do jednego wątku bo wtedy nie zamodelujesz producentów/konsumentów. Musisz tą swoją "produkcje"/"konsumpcję" wyciągnąć "ponad" wątek do jakiegoś innego obiektu i ten obiekt przekazywać w konstruktorze do swoich wątków. Weź tylko pod uwagę że wtedy dostęp do tego obiektu / do jego pól i metod będziesz musiał synchronizować!

Dzięki za pomoc.
Sam tego i tak nie niestety nie ogarnę, bo jestem noobem, ale przynajmniej wiem na czym stoję.

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