String von Client zu Server kommt nicht an

Turing0001

Aktives Mitglied
Hallo Leute,

ich sehe wohl mal wieder den Wald vor lauter Bäumen nicht mehr. Ich habe einen einfachen Client und einen einfachen Server geschrieben. Der Client sendet einen
SQL Befehl als String an einen Server, der das Ganze weiterleitet an eine SQLITE-Datenbank und das Resultset dann mittels einer ArrayList an den Client zurückschickt. Das Zurüsckschicken funktioniert, die Daten werden angezeigt, wenn ich den SQL-Befehl innerhalb des Servers erzeuge. Der von Client gesendete String scheint dort aber nicht anzukommen, vielleicht mache ich da einen prinzipiellen Dnkfehler. Könnte mal jemand drüberschauen und mir sagen warum der String nicht ankommt beim Server? Vielen Dank schon mal vorab.
Hier zunächst der Client:

Java:
package mypackage;

import java.io.*;
import java.net.*;
import java.util.ArrayList;




public class ClientDB {
    
     private InetSocketAddress address;
     PrintWriter writer;
    
    public void los()
    {
        
        try
        {
        
          address = new InetSocketAddress("localhost",4243);
          Socket s = new Socket();
          s.connect(address, 3000); // Verbinde Dich mit dem Server, maximale Wartezeit: 3 Sekunden
          writer = new PrintWriter(s.getOutputStream());
          ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
          writer.println("select * from leute");
          writer.flush();
          ArrayList <String> al = (ArrayList<String>)(ois.readObject());
          System.out.println(al.toString());
        
        
          ois.close();
          s.close();
          writer.close();
        }
          
       catch(IOException ex) {ex.printStackTrace();}
       catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Client starten:
        
        ClientDB client1 = new ClientDB();
        client1.los();
    }
}


Und nun noch der Server:


Java:
package mypackage;

import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.JOptionPane;



public class ServerDB {
    
    Connection conn;//Schnittstelle um Verbindung zur DB herzustellen
    Statement stmt;
    ResultSet rSet;
    BufferedReader reader;
    

    public void los()
    {
        try
        {
            ServerSocket servsock = new ServerSocket(4243); // Verbindungsschnittstelle auf Port 4243 erstellen
            while(true)
            {
                System.out.println("Hallo hier ist der Server!");
                Socket sock = servsock.accept(); // Warten auf "Anruf" von einem Client. accept() blockiert bis ein Client "anruft"

                InputStreamReader isReader = new InputStreamReader (sock.getInputStream());
                reader = new BufferedReader(isReader);
                String nachricht = null;
                System.out.println("Bin hier");
                
                while((nachricht = reader.readLine()) != null)
                {
                     System.out.println("Empfangene Nachricht: " + nachricht);
                }
        
              
                JOptionPane.showMessageDialog(null, "Nachricht: " + nachricht);
              
               DriverManager.setLogWriter(new PrintWriter(System.out));
               Class.forName("org.sqlite.JDBC");
               System.out.println("Treiber geladen");
               String url = "jdbc:sqlite::resource:"+ "MyDB.db";
               conn = DriverManager.getConnection(url,"",""); // Verbindungsobjekt erstellen
                  System.out.println("Verbindung steht" );
                  stmt = conn.createStatement();
                  rSet = stmt.executeQuery(nachricht); // Schicke den SQL-Befehl an die Datenbank und nimm das Ergebnis entgegen
                  ResultSetMetaData md = rSet.getMetaData(); // Ermittele Meta-Daten des ResultSets
                  int columns = md.getColumnCount();
                  System.out.println("Anzahl der Spalten: " + columns + " \n");
                  ArrayList <String> tabledat = new ArrayList<String>();
                  while(rSet.next()) { // Solange noch Ergebnisdatensätze da sind...
                
                for(int i=1; i<=columns; ++i) {
                     // Durchlaufe alle Spalten der aktuellen Zeile des ResultSets
                    tabledat.add(rSet.getString(i)); // Aktuellen Eintrag des ResultSets in ArrayList speichern
                    
                }
            }
                  
                  
                  
                  
                  
               OutputStream os = sock.getOutputStream();
               ObjectOutputStream oos = new ObjectOutputStream(os);
               oos.writeObject(tabledat);
               oos.flush();
               oos.close();
               servsock.close();
            }
            
        }
        
        catch (IOException ex)
        {ex.printStackTrace();}
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {           
            CloseDB(stmt,conn); // Datenbankverbindung schließen
        }   
    
    
  
}
    
    public void CloseDB(Statement stmt, Connection conn )
    {
        try {
            stmt.close();
            conn.close();
        } catch(Exception e) {
            //
        }
    }
    public static void main(String[] args) {
        // Starte den Server:
        
        ServerDB serv = new ServerDB();
        serv.los();
    }
}
 

fhoffmann

Top Contributor
Wird die Nachricht denn auf der Konsole (des Servers) ausgegeben?
Java:
                while((nachricht = reader.readLine()) != null)
                {
                     System.out.println("Empfangene Nachricht: " + nachricht);
                }
.
Diese while-Schleife endet erst, wenn der Client die Verbindung schließt. Das tut er aber nicht, weil er noch auf eine Antwort wartet
 
K

kneitzel

Gast
nein, auf der Konsole erscheint gar nichts.
Das sollte aber - ich habe Deinen Code einfach mal 1:1 kopiert und siehe da: Auf der Konsole erscheint genau das erwartete:
Code:
C:\Projects\Java-Tests\src>java ServerDB.java
Hallo hier ist der Server!
Bin hier

Wobei die erste Zeile nach dem Start kommt und die zweite Zeile sobald der Client gestartet wird.

Daher ist das Problem genau das, was @fhoffmann bereits geschrieben hat: Dein Server liest so lange Zeilen ein, bis die Verbindung beendet wird.
 

Turing0001

Aktives Mitglied
Hallo kneitzel,

vielen Dank für die Antwort. "Bin hier" erscheint natürlich. Ich habe es auch schon ohne Schleife versucht, einfach nur nachricht = reader.readLine(),
leider auch ohne Erfolg. Wie sollte es denn richtig lauten damit der String beim Server ankommt? Ich wäre für jeden Hinweis dankbar.
 
K

kneitzel

Gast
Klar - da habe ich nicht gut genug hingeschaut. Das Problem ist, dass der Client einen ObjectInputStream erzeugt:
Java:
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Dieser erwartet natürlich sofort die Initialisierung, d.h. es werden ein paar erste Bytes gelesen und auf die wartet der Client.

Also entweder das erst erzeugen, wenn die Nachricht gesendet wurde:
Java:
            writer = new PrintWriter(s.getOutputStream());
            writer.println("select * from leute");
            writer.flush();
            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
            ArrayList <String> al = (ArrayList<String>)(ois.readObject());
            System.out.println(al.toString());

Oder dafür sorgen, dass der Server die Initialisierung sofort macht:

Java:
                System.out.println("Bin hier");

                OutputStream os = sock.getOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(os);
                oos.flush();
                
                if((nachricht = reader.readLine()) != null)
                {
                    System.out.println("Empfangene Nachricht: " + nachricht);
                }

Beides behebt die Problematik - aber nur eins von beidem ist notwendig.
 

fhoffmann

Top Contributor
@Turing0001 : Wenn das mit einem Client nun klappt, solltest du den Server danach so umschreiben, dass sich auch mehr als ein Client anmelden kann. Und es sollte möglich sein, dass ein Client mehr als eine Nachricht schickt (ohne sich neu anzumelden).
Dabei hast du zwei Probleme:
- die Methode "accept()" blockiert, bis sich ein Client angemeldet hat.
- die Methode "readLine()" blockiert, bis der Client eine Nachricht geschickt hat.
Beide Probleme kannst du durch Threads lösen:
- Es gibt einen eigenen Thread, in dem auf Anmeldungen von Clients gewartet wird (also die Methode "accept()" aufgerufen wird).
- Jedesmal, wenn sich ein Client anmeldet, wird ein neuer Thread gestartet, der auf Nachrichten des Clients wartet (also "readLine()" aufruft).
(Das zweite Problem kann man auch mit den Klassen aus "java.nio" lösen - wenn du aber nicht zu viele Clients hast, tut ein eigener Thread pro Client nicht weh.)
 

Turing0001

Aktives Mitglied
Klar - da habe ich nicht gut genug hingeschaut. Das Problem ist, dass der Client einen ObjectInputStream erzeugt:
Java:
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Dieser erwartet natürlich sofort die Initialisierung, d.h. es werden ein paar erste Bytes gelesen und auf die wartet der Client.

Also entweder das erst erzeugen, wenn die Nachricht gesendet wurde:
Java:
            writer = new PrintWriter(s.getOutputStream());
            writer.println("select * from leute");
            writer.flush();
            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
            ArrayList <String> al = (ArrayList<String>)(ois.readObject());
            System.out.println(al.toString());

Oder dafür sorgen, dass der Server die Initialisierung sofort macht:

Java:
                System.out.println("Bin hier");

                OutputStream os = sock.getOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(os);
                oos.flush();
               
                if((nachricht = reader.readLine()) != null)
                {
                    System.out.println("Empfangene Nachricht: " + nachricht);
                }

Beides behebt die Problematik - aber nur eins von beidem ist notwendig.
Hallo Kneitel,

das war es! Vielen, vielen Dank!!!! Die Problematik war mir nicht recht bewusst, aber Du hast natürlich absolut recht!
 

Turing0001

Aktives Mitglied
@Turing0001 : Wenn das mit einem Client nun klappt, solltest du den Server danach so umschreiben, dass sich auch mehr als ein Client anmelden kann. Und es sollte möglich sein, dass ein Client mehr als eine Nachricht schickt (ohne sich neu anzumelden).
Dabei hast du zwei Probleme:
- die Methode "accept()" blockiert, bis sich ein Client angemeldet hat.
- die Methode "readLine()" blockiert, bis der Client eine Nachricht geschickt hat.
Beide Probleme kannst du durch Threads lösen:
- Es gibt einen eigenen Thread, in dem auf Anmeldungen von Clients gewartet wird (also die Methode "accept()" aufgerufen wird).
- Jedesmal, wenn sich ein Client anmeldet, wird ein neuer Thread gestartet, der auf Nachrichten des Clients wartet (also "readLine()" aufruft).
(Das zweite Problem kann man auch mit den Klassen aus "java.nio" lösen - wenn du aber nicht zu viele Clients hast, tut ein eigener Thread pro Client nicht weh.)
Hallo fhoffmann,

vielen Dank für die Nachricht. Ich habe vor vielen Jahren mal ein einfaches Chatprogramm geschrieben, bei dem sich beliebige Clients bei einem Server anmelden und Nachrichten senden konnten, die dann entweder an alle Teilnehmer oder nur bestimmte weitergeleitet wurden.
Ich hatte das damals so gelöst, dass bei jeder Anmeldung ein neuer Thread auf einem anonymen Port erzeugt wird für eine permanente Kommunikation mit dem Client. Die entsprechenden PrintWriter-Objekte hatte ich in einer ArrayList gespeichert, sodass beim Eintreffen einer neuen Nachricht einfach nur die ArrayList mit einen Iterator durchgelaufen werden musste um die Nachricht an alle weiterzuleiten. Hat prima funktioniert. Ist aber schon etwa 15 Jahre her, seitdem habe ich nichts mehr mit Java gemacht und bin daher ziemlich eingerostet. Ich versuche gerade mich wieder in die Materie reinzuwursteln, es kommt alles allmählich wieder, aber der Reboot dauert ein wenig. Aber ich fange an, dieses Forum zu mögen. Ich mag den respektvollen Umgang miteinander, bei anderen Foren wird man oft zuerst einaml beleidigt bevor man eine vernünftige Antwort bekommt. Wir werden wohl in nächster Zeiz noch häufiger kommunizieren, ich freue mich schon darauf.Vielen Dank nochmals für die Hilfe.
 

Turing0001

Aktives Mitglied
Hallo Ihr Javaner,

jetzt muss ich das Thema doch nochmal aufgreifen. Das Programm funktioniert wunderbar innerhalb meines lokalen Netzwerkes. Jetzt experimentiere ich gerade mit meiner WAN-Ip. Hier habe ich wieder dasselbe Problem, dass der Server mir zwar die Meldung ausgibt "Bin hier", aber der SQL-String nicht ankommt. Auf meinem zweiten Rechner habe ich für Port 4243 natürlich in meinem Router eine Portweiterleitung eingerichtet, welche auch funktioniert, wie ich bereits mit anderen Programmen getestet habe (einfaches Chat-Programm). Was übersehe ich hier? Oder isteckt da ein prinzipieller Fehler dahinter? Vielen Dank schon vorab wieder für eure Mühen.
 

Jw456

Top Contributor
PS der Router kann nur eine weiterleitung für einen Port zu eine IP machen.
ich würde auch nicht loclhost beim client benutzen sondern die IP Adresse der Netzwerkkarte die der rechner im Lan hatt.
auf diese adresse schickt der Router die antwort vom server.
 

Turing0001

Aktives Mitglied
Ja, das habe ich auch gemacht, das"localhost" ist von einer früheren Version, meistens verwende ich die IP-Adresse. Wie gesagt, innerhalb meines lokalen Netzwerks aus 3 Rechnern funktioniert ja auch alles wunderbar. Aber sowie ich über die WAN-IP versuche Kontakt aufzunehmen, kommt der String nicht an und sowohl der Client als auch der Server liefern mir nach einigen Sekunden eine Fehlermeldung:
Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat
 

Jw456

Top Contributor
Da scheint mir was mit dem Routing nicht zu stimmen.

Hast du es mal echt von außen versucht. Also von einen anderen Internetanschluss.

Du hast nur den Port im Router freigegeben mehr nicht oder?
 

Turing0001

Aktives Mitglied
Nein, von außen habe ich es noch nicht versucht, aber das Chat-Programm funktioniert, daher weiß ich das die Portweiterleitung funktionieren muss. Einige meiner Bekannten haben den Chat-Client bei sich installiert und die Kommunikation verlief reibungslos.
 

Jw456

Top Contributor
Nein, von außen habe ich es noch nicht versucht, aber das Chat-Programm funktioniert, daher weiß ich das die Portweiterleitung funktionieren muss. Einige meiner Bekannten haben den Chat-Client bei sich installiert und die Kommunikation verlief reibungslos.
dann sind es ja auch echte wan verbindungen .



Der Client schickt es an die Wan-IP durch die Port Weiterleitung im Router kommt es auf den Server Rechner an. Der schickt die Antwort auf seine IP im Lokalen Netz.
Dein Client wartet auf der Wan IP auf seine Antwort.
 

Turing0001

Aktives Mitglied
Hallo Jw456,

ich glaube ich verstehe was Du meinst. Aber wie kann ich das Problem beheben? Ich stehe da gerade auf dem Schlauch. Was aber merkwürdig ist: Ich hatte ein Testprogramm geschrieben, welches mir von einem Server ein serialisiertes Objekt des Typs Punkt (eigene Testklasse) zu meinem Client zusendet. Die Kommunikation läuft ebenfalls über die WAN-IP und funktioniert einwandfrei, der Code ist nahezu identisch, die Daten kommen beim Client an, werden zurückgecastet und korrekt angezeigt. Daher meine Verwirrung.
 
K

kneitzel

Gast
Ja, das habe ich auch gemacht, das"localhost" ist von einer früheren Version, meistens verwende ich die IP-Adresse. Wie gesagt, innerhalb meines lokalen Netzwerks aus 3 Rechnern funktioniert ja auch alles wunderbar. Aber sowie ich über die WAN-IP versuche Kontakt aufzunehmen, kommt der String nicht an und sowohl der Client als auch der Server liefern mir nach einigen Sekunden eine Fehlermeldung:
Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat
Das müsstest Du noch einmal etwas erläutern. Was ist das genaue Verhalten?
- Du lässt den Server Laufen
-> Verbindungen lokal funktionieren
-> Verbindungen von Bekannten auf die WAN IP funktionieren?
-> Verbindungen von dir selbst auf die WAN IP funktionieren nicht?

Der Client schickt es an die Wan-IP durch die Port Weiterleitung im Router kommt es auf den Server Rechner an. Der schickt die Antwort auf seine IP im Lokalen Netz.
Dein Client wartet auf der Wan IP auf seine Antwort.
Nein, das stimmt so nicht. Der Router ist nicht nur ein einfacher Router(Der Pakete von a nach b weiter leitet) sondern er schreibt die Adressen auch um (Network Address Translation - NAT). Daher gehen die Pakete vom Server auch über den Router an den Client zurück.

ich glaube ich verstehe was Du meinst. Aber wie kann ich das Problem beheben? Ich stehe da gerade auf dem Schlauch. Was aber merkwürdig ist: Ich hatte ein Testprogramm geschrieben, welches mir von einem Server ein serialisiertes Objekt des Typs Punkt (eigene Testklasse) zu meinem Client zusendet. Die Kommunikation läuft ebenfalls über die WAN-IP und funktioniert einwandfrei, der Code ist nahezu identisch, die Daten kommen beim Client an, werden zurückgecastet und korrekt angezeigt. Daher meine Verwirrung.
Du hast diesbezüglich kein Problem und musst daher auch nichts in dem Bereich beheben.
 

Jw456

Top Contributor
Wenn du im Client die lokale IP benutzt müsste es gehen auch von außen von einen zweite Internet Anschuss.
Wenn der Port für den Server offen ist.



Du willst es ja mit nur einen Internet Anschluss simulieren.
Der Server Rechner müsste eine Bridges haben die eine Port (4243) Weiterleitung zur Wan-IP macht.
 

Jw456

Top Contributor
Das müsstest Du noch einmal etwas erläutern. Was ist das genaue Verhalten?
- Du lässt den Server Laufen
-> Verbindungen lokal funktionieren
-> Verbindungen von Bekannten auf die WAN IP funktionieren?
-> Verbindungen von dir selbst auf die WAN IP funktionieren nicht?


Nein, das stimmt so nicht. Der Router ist nicht nur ein einfacher Router(Der Pakete von a nach b weiter leitet) sondern er schreibt die Adressen auch um (Network Address Translation - NAT). Daher gehen die Pakete vom Server auch über den Router an den Client zurück.


Du hast diesbezüglich kein Problem und musst daher auch nichts in dem Bereich beheben.
er will es local bei sich simmuliren
 

Turing0001

Aktives Mitglied
Hallo Kneitzel,

schön von Dir zu hören.
Server läuft, Client wird gestartet. Bei clientseitigem Zugriff via lokaler Server-IP-Adresse ist alles klar, die Daten werden aus der Datenbank vom Server ermittelt, an den Client zurückgeschickt und korrekt dargestellt. Ändere ich aber im Client die lokale Serveradresse von meinem zweiten Rechner (der mitder Portweiterleitung) in die WAN-IP um, erscheint nach einigen Sekunden obige Fehlermeldung. Bei meinem Chat-Programm tritt der Fehler nicht auf. Da liegt der Server auch wieder auf meinem zweiten Rechner und sowohl ich als auch meine Bekannten können problemlos über die WAN-IP kommunizieren.
 

Jw456

Top Contributor
Nein, das stimmt so nicht. Der Router ist nicht nur ein einfacher Router(Der Pakete von a nach b weiter leitet) sondern er schreibt die Adressen auch um (Network Address Translation - NAT). Daher gehen die Pakete vom Server auch über den Router an den Client zurück.
er hat im cleint die Wan-IP angegeben.
wenn von der Wan_IP was kommt wo soll der Router es hinn schiken -> port weiterleitung zum server
 

Turing0001

Aktives Mitglied
Korrektur: Habe gerade nochmal das Chat-Programm getestet und bekomme dort nun plötzlich denselben Fehler. Merkwürdig!
Scheint doch eher ein Problem beim Router zu sein. Ich werde das nachher nochmal checken.
 
K

kneitzel

Gast
Server läuft, Client wird gestartet. Bei clientseitigem Zugriff via lokaler Server-IP-Adresse ist alles klar, die Daten werden aus der Datenbank vom Server ermittelt, an den Client zurückgeschickt und korrekt dargestellt. Ändere ich aber im Client die lokale Serveradresse von meinem zweiten Rechner (der mitder Portweiterleitung) in die WAN-IP um, erscheint nach einigen Sekunden obige Fehlermeldung. Bei meinem Chat-Programm tritt der Fehler nicht auf. Da liegt der Server auch wieder auf meinem zweiten Rechner und sowohl ich als auch meine Bekannten können problemlos über die WAN-IP kommunizieren.
Ok, also der Chat Server funktioniert auch per WAN. der neue Server funktioniert aber nicht. Die Information, dass Deine Freunde sich verbinden konnten, bezieht sich nur auf den Chat Server.

Interessant ist, dass die erste Verbindungsanfrage zu funktioniert scheint. Damit dürften typische Probleme wie Firewall und Co nicht die Ursache sein (Zumindest nicht in den üblichen Einstellungen).

Da es lokal funktioniert, dürfte der Code prinzipiell korrekt sein. Kannst Du aber vorsichtshalber doch den jeweiligen Code für die Verbindungen auf Server und Client Seite zeigen?

er hat im cleint die Wan-IP angegeben.
wenn von der Wan_IP was kommt wo soll der Router es hinn schiken -> port weiterleitung zum server
Der Client schickt es zum Router, der Router macht eine NAT und schickt das Paket dann an den Server. Der Server antwortet dem Router (Denn in dem Paket, das der Server bekommen hat, steht ja eine Adresse vom Router), dieser empfängt das Paket, führt wieder eine NAT durch und schickt das Paket an den Client.
 

Turing0001

Aktives Mitglied
Habe es gerade nochmal mit einem anderen Programm getestet. Solange ich nur Daten von Server anfordere funktioniert es. Wenn ich aber Daten vom Client an den Server sende und auf Rückantwort warte, gibt es plötzlich Probleme, die es vorher nicht gab. Ich poste mal nochmal den vollständigen Code von meinem Client und dem Server. Ich bitte das Chaos schon im Voraus zu entschuldigen
 

Jw456

Top Contributor
Der Client schickt es zum Router, der Router macht eine NAT und schickt das Paket dann an den Server. Der Server antwortet dem Router (Denn in dem Paket, das der Server bekommen hat, steht ja eine Adresse vom Router), dieser empfängt das Paket, führt wieder eine NAT durch und schickt das Paket an den Client.
ja aber der ceint hat keine Locale ip sondern die Wan-IP was falsch ist.

seine Freunde wo es geht benutzen bestimmt eine version mit localer Cliint IP, und klar da geht es auch von ausen mit offnen port am server.
 

Turing0001

Aktives Mitglied
Hier noch mal der Client (die IP-Adresse ist hier natürlich die lokale im Netz, mit der es funktioniert)

Java:
package mypackage;

import java.io.*;
import java.net.*;
import java.util.ArrayList;




public class ClientDB {
    
     private InetSocketAddress address;
     PrintWriter writer;
    
    public void los()
    {
        
        try
        {
        
            
         address = new InetSocketAddress("192.168.2.101",4243);
          Socket s = new Socket();
          s.connect(address, 1000); // Verbinde Dich mit dem Server, maximale Wartezeit: 3 Sekunden
          
          // Erstellen eines Printwriters, da hier Texte und keine binären Rohdaten gesendet werden:
          
          writer = new PrintWriter(s.getOutputStream());
          writer.println("select * from leute"); // SQL-Befehl an Server absenden
          try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
          writer.flush();
          
          // Empfangen werden vom Server aber binäre Rohdaten, also wird ObjectInputStream benötigt:
          
          ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
          
    
          // Ausgabe der ArrayList mit dem ResultSet der Datenbank in einem String
          // nachdem die Rohdaten zunächst wieder in eine ArrayList von Typ String
          // zurückverwandelt wurden
          
          System.out.println("Ausgabe der Daten:");
          ArrayList <String> al = (ArrayList<String>)(ois.readObject());
          System.out.println(al.toString());
        
        
//          ois.close();
//          s.close();
//          writer.close();
        }
          
       catch(IOException ex) {ex.printStackTrace();}
       catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Client starten:
        
        ClientDB client1 = new ClientDB();
        client1.los();
    }
}


Und hier noch der Server:


Java:
package mypackage;

import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import javax.swing.JOptionPane;



public class ServerDB {
    
    Connection conn;//Schnittstelle um Verbindung zur DB herzustellen
    Statement stmt;
    ResultSet rSet;
    BufferedReader reader;
    

    public void los()
    {
        try
        {
            ServerSocket servsock = new ServerSocket(4243); // Verbindungsschnittstelle auf Port 4243 erstellen
            while(true)
            {
                System.out.println("Hallo hier ist der Server!");
                Socket sock = servsock.accept(); // Warten auf "Anruf" von einem Client. accept() blockiert bis ein Client "anruft"
                
                // Empfange einen String (= SQL Befehl) vom Client:
                
                InputStreamReader isReader = new InputStreamReader (sock.getInputStream());
                reader = new BufferedReader(isReader);
                String nachricht = null;
                System.out.println("Bin hier");
                

        
                nachricht = reader.readLine(); // Lesen des SQL Befehls
            
                System.out.println("Empfangene Nachricht: " + nachricht);
                //JOptionPane.showMessageDialog(null, "Nachricht: " + nachricht);
                System.out.println("Empfangene Nachricht nochmal: " + nachricht);
                // Ab hier wieder wie gehabt Verbindung zur Datenbank:
                
               DriverManager.setLogWriter(new PrintWriter(System.out));
               Class.forName("org.sqlite.JDBC");
               System.out.println("Treiber geladen");
               String url = "jdbc:sqlite::resource:"+ "MyDB.db";
               conn = DriverManager.getConnection(url,"",""); // Verbindungsobjekt erstellen
                  System.out.println("Verbindung steht" );
                  stmt = conn.createStatement();
                  rSet = stmt.executeQuery(nachricht); // Schicke den SQL-Befehl an die Datenbank und nimm das Ergebnis entgegen
                  ResultSetMetaData md = rSet.getMetaData(); // Ermittele Meta-Daten des ResultSets
                  int columns = md.getColumnCount();
                  System.out.println("Anzahl der Spalten: " + columns + " \n");
                  
                  ArrayList <String> tabledat = new ArrayList<String>();
                  
                  while(rSet.next()) { // Solange noch Ergebnisdatensätze da sind...
                
                for(int i=1; i<=columns; ++i) {
                     // Durchlaufe alle Spalten der aktuellen Zeile des ResultSets
                    tabledat.add(rSet.getString(i)); // Aktuellen Eintrag des ResultSets in ArrayList speichern
                    
                }
            }
                  
                  
                  
                  // Ergebnis der Datenbankabfrage wir wieder als binärer Datenstrom zum
                  // Client zurückgeschickt
                  
                  OutputStream os = sock.getOutputStream();
                  ObjectOutputStream oos = new ObjectOutputStream(os);
                  
               oos.writeObject(tabledat);
               oos.flush();
              
               oos.close();
               servsock.close();
            }
            
        }
        
        catch (IOException ex)
        {ex.printStackTrace();}
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {           
            CloseDB(stmt,conn); // Datenbankverbindung schließen
        }   
    
    
  
}
    
    public void CloseDB(Statement stmt, Connection conn )
    {
        try {
            stmt.close();
            conn.close();
        } catch(Exception e) {
            //
        }
    }
    public static void main(String[] args) {
        // Starte den Server:
        
        ServerDB serv = new ServerDB();
        serv.los();
    }
}

Vielen Dank für eure Hilfe!
 

Jw456

Top Contributor
wenn du die locale IP benutzt
address = new InetSocketAddress("192.168.2.101",4243);

könnte es doch an der WireFall ligen.

ich habe dich so verstanden das du im Client die öffentliche Adresse "Wan-IP" eingetragen hast .
 

Turing0001

Aktives Mitglied
Ja, habe ich auch. Aber mit den oben erwähnten Testprogrammen funktioniert es ja, zumindest solange die Kommunikation (Senden von Daten) nur von Server zu Client läuft. Sowie die Kommunikation bidirektional wird, gibt es die erwähnten Probleme.
 

Jw456

Top Contributor
Hier noch mal der Client (die IP-Adresse ist hier natürlich die lokale im Netz, mit der es funktioniert)


Ja, habe ich auch. Aber mit den oben erwähnten Testprogrammen funktioniert es ja, zumindest solange die Kommunikation (Senden von Daten) nur von Server zu Client läuft. Sowie die Kommunikation bidirektional wird, gibt es die erwähnten Probleme.

also geht es mit localer IP auch nicht bidirektional?
 
K

kneitzel

Gast
ja aber der ceint hat keine Locale ip sondern die Wan-IP was falsch ist.

seine Freunde wo es geht benutzen bestimmt eine version mit localer Cliint IP, und klar da geht es auch von ausen mit offnen port am server.
Bitte: Beschäftige Dich mit den Grundlagen ehe Du Dich zu irgendwelchen Aussagen hinreissen lässt.

@Turing0001 So leid es mir tut, aber mein Ratschlag wäre, hier die Aussagen von @Jw456 erst einmal zu ignorieren. Die können Dich nicht weiter bringen. Die TCP/IP Verbindung funktioniert ja auch, sonst gäbe es keine Verbindung und Dein "Solange ich nur Daten von Server anfordere funktioniert es." zeigt es ja auch.

Ich hoffe, dass ich so in 30 Minuten dazu komme, mir den Code im Detail anzusehen.
 

Turing0001

Aktives Mitglied
Mit lokaler IP-Adresse funktioniert imlokalen Netz alles, auch das Chat-Programm, welches vor einigen Monaten auch noch mit der WAN-IP gelaufen ist, daher bin ich ja so verwirrt. Ich werde aber auch nochmal den Router checken. Meine WAN-IP hatte sich seit damals nach einem Reset verändert, vielleicht hat es da im Router etwas durcheinander gewürfelt, mal sehen.
 
K

kneitzel

Gast
Solange ich nur Daten von Server anfordere funktioniert es. Wenn ich aber Daten vom Client an den Server sende und auf Rückantwort warte, gibt es plötzlich Probleme, die es vorher nicht gab.
Also wenn ich mir die ClientDB und ServerDB Klassen ansehe, dann sieht es erst einmal so aus, als ob du da doch nur den Part "Daten von Server anfordern" hast. Sprich: Das, was Du da gezeigt hast, funktioniert. Habe ich das richtig verstanden?

Die Frage wäre also: Welcher Code funktioniert nicht. Ich habe da evtl. noch nicht alles so 100% verstanden.

Generell gefällt mir die Struktur da aber auch noch nicht so richtig. Ich würde da zu ein paar Änderungen raten, die ich erst einmal kurz skizzieren möchte:
- Der Server hat mehrere Threads: Der erste Thread startet den ServerSocket und wartet dann auf neue Verbindungen. Für jede neue Verbindung wird dann ein eigener Thread gestartet.
- Die Verbindung ist generell Bidirektional. Server / Client warten generell auf Nachrichten um diese dann zu bearbeiten.

Wie so ein Rahmen aussehen könnte, werde ich Dir nachher einmal anhand des umgestellten Codes einmal zeigen und dann an Hand des konkreten Codes es etwas ausführlicher erläutern.

Dabei noch ein paar Punkte, die Du im Hinterkopf behalten solltest:
- Du erlabst Zugriffe von außen - das ist prinzipiell kritisch, denn die Ports werden ständig gescannt und es wird massiv Verbindungen geben. Das sehe ich zumindest bei den Ports, auf denen ich einen Tomcat und einen Terminalserver nach außen laufen lasse. Und bei sowas rate ich zu zusätzlichen Maßnahmen (ich erlaube z.B. nur Verbindungen aus D und F).
- Das ist dann eine Multi Threaded Variante mit Sockets - das ist eigentlich veraltet. Aktuell wäre sowas asynchron mit den Channeln aus java.nio umzusetzen. Aber für einzelne Anfragen ist das ok.
 
K

kneitzel

Gast
ich glaube du liest manchmal auch nicht richtig
Was ist an deinen wirren Aussagen etwas "richtig" zu lesen? Ich habe den Ablauf grob skizziert. Das kann man auch noch weiter aufdröseln, damit Du den TCP/IP Verlauf verstehst. Man könnte auch per wireguard Pakete scannen und dann schauen: Was geht denn von Client an Router und dann von Router an Server (und umgekehrt).

Du könntest aber auch einfach alles nachlesen - das sind keine Geheimnisse sondern es ist alles offen und gut dokumentiert zu finden. Und darauf werde ich im Detail jetzt hier nicht weiter eingehen, denn für den TE ist dies nicht relevant.
 

Turing0001

Aktives Mitglied
Hallo Kneitzel,
das obige Programm funktioniert nur im lokalen Netz. Gebe ich im Client aber die WAN-IP statt der lokalen IP des Servers ein, kommt nach einigen Sekunden die oben erwähnte Fehlermeldung
 

Turing0001

Aktives Mitglied
Das meinte ich ja. Mit der lokalen IP des Servers, etwa 192.168.2.101 geht es, aber mit der WAN-IP nicht (mehr). Porteinstellungen stimmen noch, habe ich gerade überprüft.
 

Jw456

Top Contributor
Meine WAN-IP möchte ich natürlich nicht öffentlich posten, zusammen mit dem weitergeleiteten Port wäre mir das etwas zu riskant...
musst du auch nicht du solltest testen ob die öffentliche ip auch auch die ist die du beim Client eingetragen hast.
und ob du überhaupt eine IP V4 adresse als öffentliche hast.
 
K

kneitzel

Gast
Hallo Kneitzel,
das obige Programm funktioniert nur im lokalen Netz. Gebe ich im Client aber die WAN-IP statt der lokalen IP des Servers ein, kommt nach einigen Sekunden die oben erwähnte Fehlermeldung
Die Meldungen kommen aber beim Server und beim Client? Und nicht nur beim Client? (So hast Du es ja geschrieben gehabt: "sowohl der Client als auch der Server liefern mir nach einigen Sekunden eine Fehlermeldung:"

Kannst Du die genaue Ausgabe sowohl vom Client als auch vom Server einmal bereit stellen? Also incl. aller Ausgaben, die du so indem Code gemacht hast.
 

Turing0001

Aktives Mitglied
Hallo Kneitzel,

hier die Fehlermeldung des Clients:

java.net.SocketException: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:981)
at java.base/java.io_ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2914)
at java.base/java.io_ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2930)
at java.base/java.io_ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3427)
at java.base/java.io_ObjectInputStream.readStreamHeader(ObjectInputStream.java:962)
at java.base/java.io_ObjectInputStream.<init>(ObjectInputStream.java:405)
at mypackage.ClientDB.los(ClientDB.java:41)
at mypackage.ClientDB.main(ClientDB.java:73)


und hier die des Servers:

java.net.SocketException: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:325)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:981)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:297)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:188)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392)
at mypackage.ServerDB.los(ServerDB.java:48)
at mypackage.ServerDB.main(ServerDB.java:132)

Vielen Dank für Deine Mühe
 
K

kneitzel

Gast
Das Problem passt nicht ganz zu dem Code. Das Problem kommt daher, dass der Server derzeit noch auf eine Textzeile vom Client wartet. Dieser Request läuft dann irgendwann in einen Timeout.

Der Client selbst öffnen einen ObjectInputStream und will bei der Initialisierung ein paar erste Bytes lesen. Diese kommen aber leider nicht (da der Server ja selbst noch wartet).

Das ist aber nicht das Verhalten des Codes, den Du gepostet hast :)

Generell ist es so, dass man sich auf eine "Kommunikationsart" festlegen sollte. Also entweder mann schickt nur Text oder man nutzt Object Streams oder man macht irgend was eigenes ...

Dann öffne ich gerne die Streams direkt, damit diese dann verwendbar sind. Da di Kommunikation blockierend ist, bekommt jeder Socket einen eigenen Thread. Wenn etwas kommt (beim Server), dann wird darauf reagiert.

Das habe ich mal kurz skizziert in folgendem Code. Das ist natürlich nicht komplett, denn der Server sollte alle seine Clients kennen und so. Aber das ignorieren wir mal einfach. Und da Du komplexe Dinge gerne per Object Stream versendest, basiert alles auf ObjectStream (Ein String ist ja auch ein Objekt - kann also versendet werden!)

Eine Nachricht, die empfangen wird auf Server Seite ist dann eine ReceivedMessage und bekommt - ähnlich wie man das von Events in Swing und Co kennt, auch den Sender mit:
Java:
package mypackage.server;

public class ReceivedMessage {
    private ClientSocketHandler handler;
    private Object message;

    public ClientSocketHandler getHandler() {
        return handler;
    }

    public Object getMessage() {
        return message;
    }

    public ReceivedMessage() {
    }

    public ReceivedMessage(ClientSocketHandler handler, Object message) {
        this.handler = handler;
        this.message = message;
    }
}

Einen Client Socket will gehandhabt werden. Das ist dann einfach mal folgende Klasse geworden:
Java:
package mypackage.server;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.function.Consumer;

public class ClientSocketHandler {

    private final Socket clientSocket;
    private final ObjectInputStream in;
    private final ObjectOutputStream out;

    private Consumer<ReceivedMessage> objectHandler;

    private volatile boolean running;

    public ClientSocketHandler(final Socket clientSocket) throws IOException {
        this.clientSocket = clientSocket;
        in = new ObjectInputStream(clientSocket.getInputStream());
        out = new ObjectOutputStream(clientSocket.getOutputStream());
        running = true;
    }

    public void start() {
        new Thread(this::receiveMessages).start();
    }

    public void sendMessage(Object obj) throws IOException {
        out.writeObject(obj);
    }

    public void receiveMessages() {
        while (running) {
            try {
                Object obj = in.readObject();
                if (objectHandler != null) objectHandler.accept(new ReceivedMessage(this, obj));
            } catch (EOFException eofe) {
              System.out.println("Connection closed ...");
              running = false;
            } catch (IOException ioe) {
                ioe.printStackTrace();
                System.out.println("Could not read from socket, closing!");
                running = false;
            } catch (ClassNotFoundException cnfe) {
                System.out.println("Message discarded, class not found: " + cnfe.getMessage());
            }
        }
        safeClose(in);
        safeClose(out);
        safeClose(clientSocket);
    }

    private void safeClose(AutoCloseable closeable) {
        if (closeable == null) return;
        try {
            closeable.close();
        } catch (Exception ex) {}
    }

    public void setObjectHandler(Consumer<ReceivedMessage> objectHandler) {
        this.objectHandler = objectHandler;
    }
}

Ist schnell umschrieben: Bekommt einen Socket, öffnet darauf die Object Streams. Man kann eine Routine hinterlegen, die Nachrichten dann verarbeitet. Und man kann das natürlich noch starten.

Ein einfacher Server sieht dann so aus:
Java:
package mypackage.server;

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

public class Server {
    private final int port;
    private boolean running;
    private ServerSocket serverSocket;

    public Server (final int port) {
        this.port = port;
    }

    public void open() {
        if (running) return;

        new Thread(this::acceptNewConnections).start();
    }

    private void handleMessage(ReceivedMessage msg) {
        System.out.println(msg.getMessage());
        try {
            msg.getHandler().sendMessage("Empfangen: " + msg.getMessage());
        } catch (IOException ex) {
            System.out.println("Unable to send message back!");
            ex.printStackTrace();
        }
    }

    private void acceptNewConnections() {
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Waiting on Port " + port);
            running = true;
        } catch (IOException ex) {
            System.out.println("Unable to open port!");
            ex.printStackTrace();
        }

        while (running) {
            try {
                Socket client = serverSocket.accept();
                System.out.println("Client connected ...");
                ClientSocketHandler handler = new ClientSocketHandler(client);
                handler.setObjectHandler(this::handleMessage);
                handler.start();
                // die einzelnen Handler werden in der Regel auch noch verwaltet!
            } catch (IOException ex) {
                System.out.println("Exception when accepting a new Client.");
                ex.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Server server = new Server(4243);
        server.open();
    }
}
Also in erster Linie ein Thread, der auf neue Clients wartet, die Verbindungen annimmt und dann entsprechende Handler erstellt.
Der ObjectHandler (fällt mir gerade auf, dass das blöd ist. Sollte besser NewMessageHandler heissen) ist hier einfach minimal aufgebaut. Die nachricht wird ausgegeben und ein String zurück gesendet.

Mal einfach eine angepasste Klasse, die mit dem Server umgehen kann:
Java:
package mypackage.client;

import java.io.*;
import java.net.*;
import java.util.ArrayList;

public class ClientDB {

    private InetSocketAddress address;
    ObjectOutputStream out;

    public void los()
    {
        try
        {
            address = new InetSocketAddress("127.0.0.1",4243);
            Socket s = new Socket();
            s.connect(address, 1000); // Verbinde Dich mit dem Server, maximale Wartezeit: 3 Sekunden
            out = new ObjectOutputStream(s.getOutputStream());
            out.writeObject("select * from leute"); // SQL-Befehl an Server absenden
            out.flush();

            // Empfangen werden vom Server aber binäre Rohdaten, also wird ObjectInputStream benötigt:

            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

            // Ausgabe der ArrayList mit dem ResultSet der Datenbank in einem String
            // nachdem die Rohdaten zunächst wieder in eine ArrayList von Typ String
            // zurückverwandelt wurden

            System.out.println("Ausgabe der Daten:");
            Object msg = ois.readObject();
            System.out.println(msg);


//          ois.close();
//          s.close();
//          writer.close();
        }

        catch(IOException ex) {ex.printStackTrace();}
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // Client starten:

        ClientDB client1 = new ClientDB();
        client1.los();
    }
}

Am Client habe ich kaum was gemacht - da könnte man dann noch einiges optimieren.

Was man da z.B. machen könnte:
- Man erstellt einfach Nachrichten Klassen. Also von mir aus sowas wie eine SQLQuery Klasse.
- Der NewMessageHandler prüft dann: Ist die msg vom Typ SQLQuery? -> SQL Query ausführen.

So kann man dann viele Nachrichten-Klassen bauen, die dann behandelt werden.

Man könnte dazu sogar etwas bauen wie eine Map, die als Key den Klassennamen hat und als Value dann ein Consumer<> oder so.

Also ganz klar: Das war nur ein Anfang und man kann einiges mehr ausbauen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
T server empfängt nur 1 Buchstaben vom String Netzwerkprogrammierung 1
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
T Socket Gleiche String ungleich? Netzwerkprogrammierung 8
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
F String in Datenbank speichern Netzwerkprogrammierung 1
I RMI String Netzwerkprogrammierung 2
precoc String Array versenden Netzwerkprogrammierung 7
T Socket String zu Socket Netzwerkprogrammierung 26
7 String an Server Netzwerkprogrammierung 2
lumo String[] wird zu null bei Serialisierung Netzwerkprogrammierung 8
S WebService, 4-stelliger String (Jahr) als Calendar Netzwerkprogrammierung 5
M String an PHP Script aus Java übergeben Netzwerkprogrammierung 12
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Messenger - String oder Objekte Netzwerkprogrammierung 4
T Socket Nullterminierten String lesen Netzwerkprogrammierung 4
J Datei übertragen ja String + datei übertragen nein Netzwerkprogrammierung 5
H String Array durch einen Stream schicken. Netzwerkprogrammierung 4
N Socket Stream in String Netzwerkprogrammierung 4
J Browser-String angeben Netzwerkprogrammierung 5
S String[] über Socket senden Netzwerkprogrammierung 3
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
G String in InetAddres umwandeln klappt nicht Netzwerkprogrammierung 5
A String per ByteBuffer empfangen? Netzwerkprogrammierung 6
ModellbahnerTT Problem feste String ins Netzwerk zu geben Netzwerkprogrammierung 5
G UTF-8 in STring umwandeln oder umgedreht Netzwerkprogrammierung 12
F String in eine URL umwandeln Netzwerkprogrammierung 7
P string over net Netzwerkprogrammierung 4
T Html-Source über URL in einen String speichern? Netzwerkprogrammierung 16
B HEX String zu einem Byte Array ? *verzweiflung* :( Netzwerkprogrammierung 16
K String zurück liefern ! Netzwerkprogrammierung 4
S SSLSocketFactory.createSocket(String hostname, int port),wo? Netzwerkprogrammierung 5
O Ip-String in byte[]-Array umwandeln? Netzwerkprogrammierung 3
C gesendeten String einlesen Netzwerkprogrammierung 3
G String to Socket ? Netzwerkprogrammierung 3
A StringCorruptedException: invalid String header Netzwerkprogrammierung 2
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten 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
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur 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
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
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
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
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
J Client - Serversocket Netzwerkprogrammierung 1
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
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1

Ähnliche Java Themen

Neue Themen


Oben