Unerwartetes Verhalten bei Client Server Chat App

dvdlly

Aktives Mitglied
Hallo,

Ich bin dabei mir eine Client-Server-Desktop-Chat-App mit angebundener DB zu basteln und bin beim Testen auf ein Problem gestoßen. Folgendes sind meine Klassen:
Java:
public class Request implements Serializable {
    private Map<String,String> data = new HashMap<>();
    private final String type;
    String getType(){
        return this.type;
    }
    public Request(String type){
        this.type = type;
    }
    public void setAttribute(String key, String value){
        data.put(key,value);
    }
    public String getAttribute(String key){
        return data.get(key);
    }
}
Java:
import java.io.*;
import java.net.*;
import java.sql.*;

public class Server {
    private int port;
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private Connection connection;


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

    public void addMessage(Request request){
        try {
            if (!request.getType().equals("message")){
                throw new RuntimeException("Error, Request Object is not of type message.");
            }
            Statement statement = connection.createStatement();
            String sql = "insert into messages values (default" + "'" + request.getAttribute("sender")
                    + "'" +  "," + "'" +  request.getAttribute("receiver") + "'" +  "," + "'"
                    + request.getAttribute("message") + "'" +  ");";
            statement.executeUpdate(sql);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    //TODO: WHAT HAPPENS ON THE CLIENT SIDE WHEN THIS ARRIVES?
    public void sendMessage(ResultSet resultSet){
        out.println(resultSet);
    }
    public void addUser(Request request){
        try {
            if (!request.getType().equals("adduser")){
                throw new RuntimeException("Error, Request Object is not of type adduser");
            }
            Statement statement = connection.createStatement();
            String sql = "insert into users values (default," + "'" +  request.getAttribute("firstname") + "'" +  ","
                    + "'" + request.getAttribute("lastname") + "'" +  ");";
            statement.executeUpdate(sql);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    public void start(){
        try{
            connection = DriverManager.
                    getConnection("jdbc:mysql://localhost:3306/Whatsapp","******","**********");
        }
        catch (Exception e){
            e.printStackTrace();
        }
        boolean running = true;
        try {
            while (running) {
                serverSocket = new ServerSocket(this.port);
                clientSocket = serverSocket.accept();
                ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
                ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
                Request request =  (Request) in.readObject();
                String type = request.getType();

                switch (type) {
                    case "message":
                        this.addMessage(request);
                        System.out.println("addMessage(request) was called.");
                        break;
                    case "adduser":
                        this.addUser(request);
                        break;
                    case "quit":
                        running = false;
                        break;
                    default:
                        break;
                }
            }
        }
            catch (Exception e) {
                e.printStackTrace();
            }
    }
    public static void main(String[] args){
        Server server = new Server(6666);
        server.start();
    }
}
Java:
import java.io.*;
import java.net.Socket;

public class Controller {
    private Socket clientSocket;
    private ObjectOutputStream out;
    private ObjectInputStream in;
    private final String serverIP;
    private final int serverPort;

    public Controller(String ip, int port){
        serverIP = ip;
        serverPort = port;
    }

    public void sendRequest(Request request){
        try {
            clientSocket = new Socket(this.serverIP, this.serverPort);
            ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
            //ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
            out.writeObject(request);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[]args){
        Controller controller = new Controller("localhost",6666);
        Request message = new Request("message");
        message.setAttribute("sender","1");
        message.setAttribute("receiver","2");
        message.setAttribute("id","default");
        message.setAttribute("message","hello friend!");
        controller.sendRequest(message);
        Request quit = new Request("quit");
        controller.sendRequest(quit);
    }
}

Ich führe in IntelliJ als erstes die main von Server aus, dann von Controller. Das Programm terminiert mit exit status 0, allerdings wird in meiner DB kein neuer Eintrag in messages zugefügt. Ich weiß, dass die Lösung per String für unterschiedliche Request Typen nicht gut ist, was besseres ist mir leider auf die schnelle nicht eingefallen.
Kann mir jemand sagen warum die Nachricht vom Request Objekt nicht in meine DB eingetragen wird?
 
K

kneitzel

Gast
Also SQL Befehle sollte man nicht als String so zusammen setzen sondern statt dessen sollte man PrearedStatments nutzen mit Parametern.

Und der SQL Befehl sieht auch dubios aus. Vermutlich wirst du eine Exception bekommen, die du uns hier verschweigst.
Was Du da aufbaust ist ja etwas wie:
insert into messages values (default'sender','receiver','message');
Und das ist nicht gültig. So SQL Befehle kannst Du ja auch direkt an die Datenbank abschicken - dann kannst Du die so lange anpassen, bis sie funktionieren (du den Befehl verstanden hast). Hier ist das default vermutlich zu viel.
 

dvdlly

Aktives Mitglied
Hi,
Danke für deine Antwort! Ich habe den server code jetzt so abgeändert, an der Ausgabe hat sich aber nichts geändert und nein ich habe keine Exceptions verschwiegen.
Java:
import java.io.*;
import java.net.*;
import java.sql.*;

public class Server {
    private int port;
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private Connection connection;


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

    public void addMessage(Request request){
        try {
            if (!request.getType().equals("message")){
                throw new RuntimeException("Error, Request Object is not of type message.");
            }
            PreparedStatement stmt = connection.prepareStatement("insert into messages (?,?,?,?)");
            stmt.setString(1,"default");
            stmt.setString(2,request.getAttribute("sender"));
            stmt.setString(3,request.getAttribute("receiver"));
            stmt.setString(4,request.getAttribute("message"));
            int i = stmt.executeUpdate();
            System.out.println(i + " rows inserted!");

        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    //TODO: WHAT HAPPENS ON THE CLIENT SIDE WHEN THIS ARRIVES?
    public void sendMessage(ResultSet resultSet){
        out.println(resultSet);
    }
    public void addUser(Request request){
        try {
            if (!request.getType().equals("adduser")){
                throw new RuntimeException("Error, Request Object is not of type adduser");
            }
            PreparedStatement stmt = connection.prepareStatement("insert into users (?,?,?)");
            stmt.setString(1,"default");
            stmt.setString(2,request.getAttribute("firstname"));
            stmt.setString(3,request.getAttribute("lastname"));
            int i = stmt.executeUpdate();
            System.out.println(i + " rows inserted!");
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    public void start(){
        try{
            connection = DriverManager.
                    getConnection("jdbc:mysql://localhost:3306/Whatsapp","*****","********");
        }
        catch (Exception e){
            e.printStackTrace();
        }
        boolean running = true;
        try {
            while (running) {
                serverSocket = new ServerSocket(this.port);
                clientSocket = serverSocket.accept();
                ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
                ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
                Request request =  (Request) in.readObject();
                String type = request.getType();

                switch (type) {
                    case "message":
                        this.addMessage(request);
                        System.out.println("addMessage(request) was called.");
                        break;
                    case "adduser":
                        this.addUser(request);
                        break;
                    case "quit":
                        running = false;
                        break;
                    default:
                        break;
                }
                connection.close();
            }
        }
            catch (Exception e) {
                e.printStackTrace();
            }
    }


    public static void main(String[] args){
        Server server = new Server(6666);
        server.start();
    }
}
Hast du vielleicht noch eine Idee woran es liegen könnte?
 
K

kneitzel

Gast
Also das ist im Augenblick alles relativ dubios ...

Generell
Überlege Dir, was Du an lokalen variablen haben willst und was als Instanzvariablen. Du hast da diverse Variablen doppelt und das sieht zumindest dubios aus und dürfte auch leicht zu Fehlern führen.

Client
Der Client öffnet den Socket um eine Nachricht in den Stream zu schreiben... Und das jedes Mal für jeden Request. Da wird nichts geschlossen oder so ... Wenn Du immer nur einen Request abschicken willst um dann die Verbindung zu schließen, dann mach es auch so. Also reine lokale Variablen und try with resources so dass wirklich alles geschlossen wird.

Server
Dein Server holt sich eine Datenbankverbindung - ok soweit. Nicht gut, denn die Connection ist nicht dauerhaft offen. Wenn da keine Zeit lang nichts kommt, dann schliesst der Datenbankserver die Verbindung wieder ... aber für kurze Tests erst einmal ok. Aber du schließt die Connection in der Schleife als beim zweiten Request ist die Datenbankverbindung wieder weg ...

Das Pattern, das ich hier wähle: Hol Dir immer direkt bevor Du sie brauchst eine Connection und schließe sie wieder. Dann bist Du sauber. Wenn Du den Overhead nicht willst, dann mach noch ein Connection Pooling und gut ist es. Aber halt dieser saubere Ablauf sollte immer gegeben sein!

Dann in der Schleife:
- Du erzeugst einen ServerSocket. Da Du den aber nie schließt, wird im zweiten Schleifendurchlauf ein Fehler kommen, da der Port ja schon belegt ist. Aber für die erste Verbindung funktioniert es noch ... Und ud arbeitest seriell immer einen Client nach dem anderen ab. Das ist auch untypisch.
- Dann wartest Du auf einen Client.
- Du holst Dir in den lokalen Variablen in / out die Streams vom Socket. Dies sind ObjectOutputSteam / ObjectInputStream. Bei diesen Klassen gibt es eine wichtige Problematik; Es wird eine Initialisierung gelesen / geschrieben. Da muss man aufpassen. Es werden also ggf. erste Bytes geschrieben. Das ist egal - der Client liest das nie. Bei input Stream wird was gelesen, aber das bekommt der Server hoffentlich, da ja der Client das Gegenstück erzeugt. Also dürfte es (ohne es ausprobiert zu haben) hier soweit funktionieren - es sollte aber im Hinterkopf behalten werden ...
- Dann wird ein Request gelesen. Da sollte von der Logik her der Request von dem Client kommen ... Könnte ok sein.

Das einfach nur mal so als ein paar Auffälligkeiten. Der Ablauf sieht so noch nicht wirklich sauber aus muss ich gestehen. Aber ich habe den Code jetzt nicht im Detail analysiert und da ich auch keinen Überblick habe, was genau an Ausgabe kommt oder eben nicht kommt, ist es schwer zu sagen, al welchem Punkt es im Augenblick genau scheitert.
 

Jw456

Top Contributor
serverSocket = new ServerSocket(this.port);
clientSocket = serverSocket.accept();
Accsept wartet auf eine Verbindung. Hat der kleint sich verbunden gibt es en Clientsocket zurück. Der Port ist vor weitere Verbindungen geschlossen.
Wenn du nach der Kommunikation die Verbindung nicht abbaust. Wird keine neue entstehen.
Dein Code ist nicht Thread sicher.
Das wird dein Hauptgund sein.

 

Jw456

Top Contributor
Nein, der Port ist weiter offen und es könnte jederzeit wieder ein serverSocket.accept() aufgerufen werden. Der ServerSocket muss nicht geschlossen werden.
Mag sein wenn das eine Art Chat werden soll muss er mit Threads arbeiten und sich die Verbindungen merken.

server.start(); ist kein Start eines Threads auch wenn es so ausschaut.
Da Server kein Thread ist. Der hätte dann ein run Methode.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Wenn er nur einzelne Request abarbeiten will, würde es prinzipiell funktionieren. Ab einem gewissen Andrang würden einige Verbindungsversuche von Clients halt in ein Timeout laufen und nicht akzeptiert werden.

Und wenn Verbindungen immer direkt geschlossen werden, dann ist das prinzipiell auch machbar. Das wäre dann ähnlich wie http Requests: Client baut Verbindung auf, sendet den Request, bekommt die Antwort und die Verbindung wird geschlossen.

Also technisch sind so Dinge prinzipiell denkbar. Aber ich bin von sowas ehrlich gesagt kein Fan. Wenn man sowas wirklich bauen will, dann würde ich auf jeden Fall über async channel gehen aus dem nio Namespace. Dann braucht man auch keine Threads und könnte einzeln die Selektoren abprüfen, ob etwas anliegt um dann die Dinge abzuarbeiten.

Eines noch das Accsept warten auf Verbindung, macht er in einer endlos Schleife die nur beendet wird wenn das quit empfangen wird. Erst dann wartet der Server wider auf eine Verbindung.
Das ist doch alles in dieser einen Schleife. Und beim zweiten Durchlauf der Schleife wird eine Exception kommen, da der Port bereit belegt ist.
Da wäre ein kleiner Fix, die Erzeugung des ServerSockets vor die Schleife zu ziehen:
Statt:
Java:
            while (running) {
                serverSocket = new ServerSocket(this.port);
                clientSocket = serverSocket.accept();
halt ein:
Java:
            serverSocket = new ServerSocket(this.port);
            while (running) {
                clientSocket = serverSocket.accept();

Aber das ist nur ein Punkt von mehreren, die ich da sehe.
 
K

kneitzel

Gast
Ach ja - wenn nicht gerade das Ziel ist, genau zu begreifen, was Sockets sind und wie man da mit rein der Java Library etwas machen kann, dann wäre es evtl. auch eine gute Idee, wenn man eine Library nutzt. Es gibt diverse Libraries, die da einiges für einen übernehmen können:
Netty wäre eine Möglichkeit: https://netty.io/
Kryonet wäre eine andere Möglichkeit: https://github.com/EsotericSoftware/kryonet

Wenn das Ziel bestehende Protokolle sein sollten, dann wäre Apache Commons Net etwas, das man prüfen könnte. Das sehe ich aber gerade bei Dir nicht, aber über das Ziel, wo Du hin willst, hast Du ja noch nicht viel gesagt.
 

dvdlly

Aktives Mitglied
Hey, danke für eure Bemühungen. Also ich bin gerade dabei den Code anzupassen. Bitte entschuldigt, dass ich euch so eine verschmierte Version gepostet habe - ich hab meinen Entwurf mehrmals geändert und dann vergessen Details anzupassen. Also ich studiere momentan Informatik im Bsc und möchte mein Informatik "Allgemeinwissen" erweitern. Ich dachte das Projekt ist gut geeignet, damit ich zum Beispiel lerne wie ein Server funktioniert, wie man mit einer DB Anbindung umgeht etc...
Generell suche ich nach Möglichkeiten dieses "Allgemeinwissen" zu solidifizieren. Was sind eurer Meinung nach wichtige Konzepte/Techniken im Bereich der Softwareentwicklung und Technik, die ich mir aneignen sollte?
 
K

kneitzel

Gast
Bitte entschuldigt, dass ich euch so eine verschmierte Version gepostet habe
Da musst Du Dich nicht entschuldigen. Es ist nicht unsere Erwartungshaltung, nur perfekte Dinge vorgesetzt zu bekommen. Die Hinweise sollen auch nicht irgend eine Form von "Schimpfen" sein sondern gegen Deine Person gerichtet sein. Es sollen nur Hinweise sein, die Dich weiter bringen sollen. Denn das ist aus meiner Sicht ja der Sinn des Forums.

Dein Ansatz mit einem praktischen Projekt ist auch ein guter Ansatz. Ich würde Wert auf Dinge wie OO Design (und dazu gehören auch Patterns) und den Bereich Clean Code legen. Das hilft dann auch bei anderen Themen da man Dinge strukturierter angehen kann.

Ansonsten würde ich mich nicht zu sehr auf technische Details konzentrieren (um dann direkt mit Sockets zu arbeiten) sondern da würde ich nur die generelle Theorie begreifen um dann mit Frameworks darauf zuzugreifen. Und da würde ich dann auf weit verbreitete Technologien zurück greifen um nicht auf "tote Pferde" zu setzen. Und da kommt man dann z.B. auf Spring Framework / Spring Boot oder eben Jakarta EE. Und die nutzen teilweise gleiche Dinge. z.B. JPA und so.

Generell auch immer versuchen, einen Überblick zu bekommen: Was ist der Sinn eines Frameworks? Welche Probleme sollen wie gelöst werden? Welche Limitierungen gibt es? Das ist am Anfang sehr schwer, aber man sollte sich nach und nach so ein möglichst gutes Bild machen... Ansonsten wirst Du ein Meister des Hammers und haust auch Schrauben mit dem Hammer ein (Was bestimmt auch irgendwie funktionieren wird, aber nicht unbedingt Sinn macht.)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S main-Methode gibt unerwartetes Ergebnis aus Java Basics - Anfänger-Themen 4
B equals() der Klasse Objects liefert unerwartetes Ergebnis Java Basics - Anfänger-Themen 17
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
MarvinsDepression Operatoren Verhalten von BitShiftOperatoren Java Basics - Anfänger-Themen 2
G Merkwürdiges Verhalten der Maven IDE Java Basics - Anfänger-Themen 3
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
MiMa Seltsames Verhalten im Konstruktor Java Basics - Anfänger-Themen 6
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
K Klassen Eclipse Verhalten bei Klassen Java Basics - Anfänger-Themen 16
M Verhalten von LocalDateTime#getNano() Java Basics - Anfänger-Themen 1
T Objekte mit Verhalten Java Basics - Anfänger-Themen 14
D Klassen Verhalten von Klassenvererbung bei Variablen Java Basics - Anfänger-Themen 1
D Seltsames Verhalten... Java Basics - Anfänger-Themen 5
O JFileChooser Verhalten -Pfad Java Basics - Anfänger-Themen 15
S Verhalten von JTextField in einem JTabbedPane (Register) Java Basics - Anfänger-Themen 6
G Input/Output Verhalten BuffferedReader bei unvollständigen Zeichen Java Basics - Anfänger-Themen 1
D Interface für Verhalten von "=="? Java Basics - Anfänger-Themen 21
B Thread komisches Verhalten auf Mac ... Java Basics - Anfänger-Themen 6
B Komisches Verhalten von ArrayList Java Basics - Anfänger-Themen 6
S JInternalFrame in JInternalFrame - Verhalten Java Basics - Anfänger-Themen 2
F Nicht nachvollziehbares Verhalten Java Basics - Anfänger-Themen 7
K Komisches Verhalten beim erstellen einer Datei Java Basics - Anfänger-Themen 5
T unerklärliches Verhalten von Scanner Java Basics - Anfänger-Themen 2
Ham Verhalten beim Initialisieren von Arrays Java Basics - Anfänger-Themen 16
D Komisches Verhalten einer For-Schleifen Java Basics - Anfänger-Themen 7
zilti Unlogisches Verhalten Java Basics - Anfänger-Themen 4
N public void und verhalten bei return Java Basics - Anfänger-Themen 2
A Seltsames Verhalten beim ButtonClick (ActionListener() ) Java Basics - Anfänger-Themen 7
P Komisches Verhalten von BufferedReader und readLine() Java Basics - Anfänger-Themen 2
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
berserkerdq2 Sende eine Nachricht an den Client und leere den Ausgabestorm, was ist damit genau gemeint? Java Basics - Anfänger-Themen 3
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
D Verbesserungsvorschläge zur Struktur einer Client Server Desktop Chat App Java Basics - Anfänger-Themen 24
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
I Client ObjectInputStream error... Java Basics - Anfänger-Themen 5
W Client verbindet sich nicht Java Basics - Anfänger-Themen 14
B Email Client in der eigenen Software einbauen Java Basics - Anfänger-Themen 3
S Server - für jeden Client ein Serverthread Java Basics - Anfänger-Themen 2
E SocketServer/Client stürzt ab. Address already in use. Java Basics - Anfänger-Themen 2
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
E MCLauncher eigener Client workt nicht? Java Basics - Anfänger-Themen 4
L Erste Schritte Erste Versuche mit Server und Client Java Basics - Anfänger-Themen 7
elischa Client-Server IO und Stream Steuerung ? Java Basics - Anfänger-Themen 2
I Print Client -> Server -> Client? Java Basics - Anfänger-Themen 1
I Unique client information in WebApp Java Basics - Anfänger-Themen 3
I lokales Programm mit Client/Server Programm kommunizieren Java Basics - Anfänger-Themen 3
J TCP MultiThreaded Server und Client - irgendwo ist der Fehler, aber ich find ihn nicht Java Basics - Anfänger-Themen 3
Joew0815 Error org.apache.xmlrpc.client.XmlRpcClientConfigImpl.setUserAgent Java Basics - Anfänger-Themen 2
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
K Java Client > Python Server Java Basics - Anfänger-Themen 0
O Verriegeln, aber wo? Finde den Client der zu schließem ist. Java Basics - Anfänger-Themen 0
S Java - Client/Server mit Stomp kurze Frage Java Basics - Anfänger-Themen 0
T Buffererwriter keine Exception obwohl Client weg Java Basics - Anfänger-Themen 2
E Client Server Java Basics - Anfänger-Themen 12
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
O Server Client Problem Java Basics - Anfänger-Themen 2
N Client soll mehrere Antworten von Servern gleichzeitig empfangen Java Basics - Anfänger-Themen 8
H Java Server/Client, HTML Seite anzeigen Java Basics - Anfänger-Themen 2
L Server pingt Client und fordert Info Java Basics - Anfänger-Themen 2
T Client-Fenster bei Aufruf unvollständig Java Basics - Anfänger-Themen 12
E Senden von Objects an Client. Variablenwerte kommen nicht an Java Basics - Anfänger-Themen 5
R Server/Client für Spiel Java Basics - Anfänger-Themen 2
E Client hilfe!!! Java Basics - Anfänger-Themen 7
B RMI - Fehlermeldung auf dem Client Java Basics - Anfänger-Themen 6
X Applet - Client/Server Java Basics - Anfänger-Themen 2
E Client ergibt NULL? Java Basics - Anfänger-Themen 24
E Socket (Client) dauerhaft aktiv? Java Basics - Anfänger-Themen 9
E HTTP Client - Login durchführen? Java Basics - Anfänger-Themen 4
L Ip-Adresse für Client Java Basics - Anfänger-Themen 14
L Bild versenden über Client/Server Java Basics - Anfänger-Themen 10
L Wegwerf Client Java Basics - Anfänger-Themen 26
S Klassen Server und Client Java Basics - Anfänger-Themen 3
M Client - DB-Server Struktur Java Basics - Anfänger-Themen 7
L Client aktualisieren Java Basics - Anfänger-Themen 6
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
J DNS-Client Java Basics - Anfänger-Themen 2
J Simpler DNS Client Java Basics - Anfänger-Themen 20
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
B Server-Client mit Thread ausstatten Java Basics - Anfänger-Themen 3
D Client-Server Problem Java Basics - Anfänger-Themen 2
J Netzwerkrprogammierung Client - Server Java Basics - Anfänger-Themen 3
J Netzwerkprogrammierung Client/Server Java Basics - Anfänger-Themen 16
G ArrayListe vom Server nach Client schicken Java Basics - Anfänger-Themen 17
M Flexiblen Client programmieren Java Basics - Anfänger-Themen 2
G JMS -> Wie Anmeldung vom Client an Server? Java Basics - Anfänger-Themen 4
S Webservice: Dateien downloaden vom Webserver auf den Client Java Basics - Anfänger-Themen 7
G Ausg. in JSP erzeugen die als Antwort an Client gesch. wird Java Basics - Anfänger-Themen 2
I Server / Client Programm wie einen String übergeben? Java Basics - Anfänger-Themen 6
K Client-Liste im Chat Java Basics - Anfänger-Themen 2
B Client - Server Verbindung über sockets mysql DB ansprechen? Java Basics - Anfänger-Themen 6
G Java Server Client Programmierung Java Basics - Anfänger-Themen 3
B Bild/Datei von einem Server an einen Client senden Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben