Socket Automatische Zuweisung von Server und Client Rolle

Ljonja2107

Mitglied
Moin, ich hätte mal eine Frage zur automatischen Zuweisung von Client und Server Rollen und gegebenenfalls eine Transformation zu einem Server oder zu einem Client.
Zum Verständnis, es ist eine Peer to Peer Verbindung, in welcher ein Client nur eine "Serverrolle" hat --> ServerSocket. Ansonten ist alles identisch.
Genauer geschildertes Problem:
Und zwar möchte ich zwei GUIS starten, welche miteinander kommunizieren, Textchat etc.
Ich möchte aber nicht jedes mal per Texteingabe oder ähnliches festlegen "Du bist jetzt der Server und du bist jetzt der Client."
Kann ich das irgendwie schöner machen?
Außerdem möchte ich, dass wenn einer der beiden disconnected, der andere dann eine andere Rolle einnimmt: Beispiel:
Server und Client sind verbunden über Serversocket und Socket:
Server disconnected --> Client wird zu Server und verbindet sich mit anderem Client (falls ein Client sich über den Port mit dem Server verbinden sollte)
 

LimDul

Top Contributor
Es gibt immer einen "Server" und einen "Client" in einer Verbindung.

Der eine baut die Verbindung auf (der Client), der andere nimmt sie entgegen. Für dein Problem gibt es so einfach keine technische Lösung.

Einer muss die Verbindung aufbauen, dazu muss er wissen wohin. Das heißt es wird ja mindestens eine IP-Adresse oder ähnliches benötigt. Dafür gibt es keinen Mechanismus diese "magisch" zu transferieren.

Bei deinem "Server wird disconnected" - woher soll dann der weitere Client die IP Adresse kennen, wo er sich hin verbinden soll? Wenn natürlich diese Informationen entsprechend verteilst (Da stellt sich die Frage wann und wie, vor allem im initialen Fall) dann kann man sowas natürlich machen.


Solange man sich auf ein lokales Lan beschränkt kommt man ggf. auch mit Broadcasts recht weit, dass man mal schaut, wer den so alles im Netz sich für was zuständig fühlt bzw. antwortet. Darüber kann man dann auch aushandeln, wer nun die Verbindung aufbaut. Das ganze geht aber nur innerhalb eines lokalen Lan-Segmentes.
 

LimDul

Top Contributor
Mal kurz als rudimentäre Idee:
  • Man verschickt per UDP Broadcast seine IP Adresse.
  • Damit erreich man alle Teilnehmer die da sind
  • Damit kann kann man nun eine Verbindung aufbauen (welcher Teilnehmer die dann aufbaut, müssen die aushandeln)

Sprich, über den UDP Broadcast kann sich z.B. beim Chat ein nicht verbundener Teilnehmer melden "Hallo, ist da jemand, ich bin 1.2.3.4". Dann kann aus dem Chat-Netzwerk der "zentrale" Teilnehmer eine Verbindung zu diesem neuen Teilnehmer aufbauen.
Fällt der zentrale Teilnehmer aus, dann kann man wieder über Broadcasts sich synchronisieren.
 

KonradN

Super-Moderator
Mitarbeiter
Generell wäre hier die Überlegung, sich etwas mit p2p / peer to peer Netzen zu beschäftigen. Da wäre dann ein erster Startpunkt ggf.

Da gibt es halt viele Ideen und Möglichkeiten. UDP Broadcast ist einer. Da noch einiges mehr zu nennen, ist wohl eher nicht zielführend - aber wenn man da etwas recherchiert, dann findet man sehr viel incl. Erläuterung.

Aber unter dem Strich ist es bei p2p immer so, dass jeder Client auch zugleich ein Server ist. Dabei spielt es keine Rolle, ob das Verbindungsbasiert abläuft (Dann hat jeder Client auch einen ServerSocket offen) oder ob da per UDP Datagram-Sockets verwendet werden, die halt Senden und Empfangen und damit beides in einem sind.
 

Ljonja2107

Mitglied
Generell wäre hier die Überlegung, sich etwas mit p2p / peer to peer Netzen zu beschäftigen. Da wäre dann ein erster Startpunkt ggf.

Da gibt es halt viele Ideen und Möglichkeiten. UDP Broadcast ist einer. Da noch einiges mehr zu nennen, ist wohl eher nicht zielführend - aber wenn man da etwas recherchiert, dann findet man sehr viel incl. Erläuterung.

Aber unter dem Strich ist es bei p2p immer so, dass jeder Client auch zugleich ein Server ist. Dabei spielt es keine Rolle, ob das Verbindungsbasiert abläuft (Dann hat jeder Client auch einen ServerSocket offen) oder ob da per UDP Datagram-Sockets verwendet werden, die halt Senden und Empfangen und damit beides in einem sind.
Eine weitere Frage: Vielleicht ein wenig entfernter von diesem Problem.
Ich habe eine JComboBox in welcher IP-Adressen hinzugefügt werden können.
Im 3 Sekundentakt werden die IP-Adressen angepingt und ich möchte, dass wenn der Ping angekommen ist, dass die Zeile grün gefärbt wird, in welcher die IP-Adresse steht und wenn der Ping nicht ankommt, dann soll die Zeile Rot werden. Und dies soll alle 3 Sekunden, beim anpingen, wieder gecheckt werden. Ich finde keinen Weg, dass ich spezifische Zeilen in einer Combobox anpassen kann mit den Farben.
Eine Idee?
 

KonradN

Super-Moderator
Mitarbeiter
Hast Du das Beispiel mal kopiert und ausprobiert? Du hast ein Renderer, der neben einem Array von Strings auch ein Array von Farben hat und die Strings werden in der jeweiligen Farbe angezeigt.

Das wäre dann die Anpassung der Textfarbe. Aber Du kannst auch den Hintergrund umsetzen. In dem Code siehst Du ja zum einen text.setBackground(getBackground()); das die Hintergrundfarbe setzt. Da könnte man auch die gewünschte Farbe setzen.
 

Ljonja2107

Mitglied
Ja aber so lege ich ja direkt fest, an welcher Stelle bestimmte Farben zu sehen sind.
Ich habe einen TaskTimer, welcher die ganze Zeit abfragt, ob ein Ping angekommen ist.
Die Adressen sind hinterlegt in einer ArrayList und daher werden auch die Adressen genommen.

Java:
package UDPYT;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Rectangle;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JTextArea;

public class PingCombobox extends JFrame implements ActionListener {
    static DefaultComboBoxModel<String> comboboxModel;
    private JTextField textField;
    static JComboBox<String> comboBox;
    static ArrayList<String> ipList = new ArrayList<String>();
    private JButton connect;
    static JButton addButton;
    static String txt;
    private JButton anzeigen;
    static JTextArea textArea;
static String ipAdresse;
    public PingCombobox() {
        getContentPane().setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 519, 445);
        JPanel fensterPanel = new JPanel();
        fensterPanel.setBackground(Color.WHITE);
        fensterPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(fensterPanel);
        fensterPanel.setLayout(null);

        comboBox = new JComboBox();
        comboBox.setBounds(187, 92, 232, 22);
        getContentPane().add(comboBox);

        fensterPanel.add(comboBox);

        textField = new JTextField();
        textField.setBounds(187, 40, 232, 27);
        fensterPanel.add(textField);
        textField.setColumns(10);

        addButton = new JButton("add");
        addButton.setBounds(38, 42, 89, 23);
        fensterPanel.add(addButton);
        addButton.addActionListener(this);

        connect = new JButton("Connect");
        connect.setBounds(38, 92, 89, 23);
        fensterPanel.add(connect);

        anzeigen = new JButton("Anzeigen");
        anzeigen.setBounds(38, 150, 89, 23);
        fensterPanel.add(anzeigen);
        anzeigen.addActionListener(this);
        textArea = new JTextArea();
        textArea.setEditable(false);
        textArea.setBounds(187, 151, 232, 190);
        fensterPanel.add(textArea);
        connect.addActionListener(this);
        comboboxModel = new DefaultComboBoxModel<String>();
        

    }

    public static void main(String[] args) {
        
        try {
            PingCombobox frame = new PingCombobox();
            ununterbrochenesAbfragen();
            frame.setVisible(true);
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object knopfhorcher = e.getSource();

        if (knopfhorcher == addButton) {
            ipAdresse=textField.getText();
            if (ipAdresse.equals("")) {
                textArea.setText("Keine Eingabe.");
            }else{
             ipAdresse = textField.getText();
            comboboxModel.addElement(ipAdresse);
            ipList.add(ipAdresse);
            textField.setText("");
            comboBox.setModel(comboboxModel);}
        } else if (knopfhorcher == connect) {
            txt = (String) comboBox.getSelectedItem();

          

        } else if (knopfhorcher == anzeigen) {
            listeChecken();
        }

    }

    public static void sendPingRequest() throws IOException {
        for (int i = 0; i < ipList.size(); i++) {
            InetAddress zielAdresse = InetAddress.getByName(ipList.get(i));
            System.out.println("Sending Ping Request to " + ipList.get(i));
            if (zielAdresse.equals("")) {
                System.out.println("noch leer");
            } else {
                if (zielAdresse.isReachable(5000)) {
                    System.out.println("Ist angekommen");
                } else {
                    System.out.println("Keine Antwort angekommen");
                }
            }
        }

    }

    public static void ununterbrochenesAbfragen() {
        int minutes = 1;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                
                try {
                    sendPingRequest();
                } catch (IOException e) {

                  
                }

            }

        }, 0, 100 * 60 * minutes);
    }

    public static void listeChecken() {
        for (int i = 0; i < ipList.size(); i++) {
            textArea.append(ipList.get(i) + "\n");
            System.out.println(ipList.get(i));
        }
    }

}

Der Connect Button ist noch unberührt und der anzeigen Button gibt nur die IP-Adressen nochmal gelistet wieder (Testzwecke).
 

KonradN

Super-Moderator
Mitarbeiter
Sorry, wenn ich das so sage: Der Ansatz ist so schon vermurkst.

Wenn Du eine Software schreiben willst, dann solltest Du immer Logik und UI sauber trennen. Es fängt also in der Regel mit einem Datenmodel an und dann Methoden, die Du da brauchst. Da ist dann noch keinerlei UI! Wenn Du das dann hast, dann kannst Du die UI machen.

Und vor allem trenne Dich von dem static und kapsel die Variablen vernünftig.

Rein technisch könnte man zwar so weiter machen - dann erstellst Du den Renderer, fügst noch eine static ArrayList<Color> hinzu, die dann verwendet wird. Bei Änderungen rufst Du ein repaint auf. Aber wenn Du bei dem kleinen Beispiel den Überblick nicht gewonnen hast: Wie willst Du dann in so einem Aufbau, wo Klassen wild durcheinander aufeinander zugreifen, einen Überblick haben?

Das ist nicht böse gemeint, aber bei so Code vergeht auch tatsächlich sehr schnell die Lust, da mehr Zeit zu investieren als unbedingt notwendig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Automatische Ordner- und Berechtigungsstruktur (Aktive Directory) Netzwerkprogrammierung 3
P Automatische Host suche im Netzwerk Netzwerkprogrammierung 3
G automatische datensammlun Netzwerkprogrammierung 5
Z automatische einwahl ins internet Netzwerkprogrammierung 2
F http Post auf einen Grafana Server Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
E Server mit GUI Netzwerkprogrammierung 4
E FTP FTPS Server gibt Fehlernachricht "522 SSL/TLS required on the data channel" zurück Netzwerkprogrammierung 1
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
Eigenen Rechner als Server? Netzwerkprogrammierung 16
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
J Datei Download vom Server Netzwerkprogrammierung 8
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
J Client-Server und SOAP Netzwerkprogrammierung 23
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
J Multithreaded-Server Netzwerkprogrammierung 21
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
L30nS RMI RMI-Server kann Dialog nicht volkommen anzeigen Netzwerkprogrammierung 2
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
S Von Java auf passwortgeschützten Server zugreifen + Umgang mit Ports Netzwerkprogrammierung 28
S Probleme bei Java-Installation auf Server (Linux/Shell/Terminal) Netzwerkprogrammierung 6
S Java: Anbindung an einen realen Server? (+ Portfreigabe) Netzwerkprogrammierung 8
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S HTTP Post?!? - Java Server Netzwerkprogrammierung 7
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
F NodeJs-Server auf Firebase hosten ? Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
H HTTP Glassfish (v5) Application Server - Bibliothek zur Verfügung stellen Netzwerkprogrammierung 4
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
P TCP-Server Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
F Server für Java Applikationen Netzwerkprogrammierung 16
H Einfacher Server funktioniert nicht Netzwerkprogrammierung 1
G Server-Client IO Problem Netzwerkprogrammierung 6
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
T HTTPS-Requests an Server: POST-Parameter kommen nicht an Netzwerkprogrammierung 5
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
T Jetty Server LOGGING Netzwerkprogrammierung 1
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
S Spiel mit Server programmieren Netzwerkprogrammierung 2
N Post u Head Request an Server Netzwerkprogrammierung 4
J Socket Ein Chat Server Tutorial Netzwerkprogrammierung 8
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
J Socket Tutorial zu Multiplayer Server schreiben? Netzwerkprogrammierung 5
S Java Chat Server Netzwerkprogrammierung 8
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
KaffeeFan Programmierung mit Cloud-Server Netzwerkprogrammierung 0
L Socket Problem mit Server Netzwerkprogrammierung 1
cezary Socket Paralleler Server ? Netzwerkprogrammierung 1
I Socket Leicht zu DDosender Server Netzwerkprogrammierung 4
agent47 HTTPs Server Netzwerkprogrammierung 5
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
P Server als Client nutzen Netzwerkprogrammierung 8
S Server Kommunikation Netzwerkprogrammierung 1
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
S Webservice - Server Netzwerkprogrammierung 0
M Java Eingabe auf FTP Server übergeben Netzwerkprogrammierung 4
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
M Socket Java Server: NullPointerException Netzwerkprogrammierung 4
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
J Java Server empfängt php inhalt nicht Netzwerkprogrammierung 1
K C# Server - Android Client Netzwerkprogrammierung 0
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
F Verbindung zwischen Server und handy Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben