Versuch mit Socket etwas zu lesen und zu schreiben

BodyLAB

Bekanntes Mitglied
Hallo zusammen,

ich möchte gerne ein kleinen Taschenrechner Programmieren. Nur ganz simpel doch ich schaffe es nicht mal mit Sockets überhaupt Daten zu Lesen und zu schreiben.
Meine Server Klasse sieht wie folgt aus:
Java:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class A1Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket client = null;
        try {
            serverSocket = new ServerSocket(4242);
        } catch (Exception e) {
            System.out.println("Fehler beim Erzeugen des ServerSockets");
            return;
        }

        while (true) {
            try {
                client = serverSocket.accept();
                if (client.isConnected()) {
                    System.out.println("Neuer Spieler connected: " + client.getInetAddress());
                    new A1Handler(client.getInetAddress().getHostName(), client);
                }

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

    }

}

In dieser Klasse erstelle ich ein Handler Objekt, was die Arbeit erledigen soll. Dort fehlt nun natürlich noch die ganze Logig, da ich leider schon am senden und empfangen von String scheitere :(
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class A1Handler extends Thread {

    Socket client;
    String name;
    BufferedReader in;
    PrintWriter out;

    A1Handler(String name, Socket client) {
        this.name = name;
        this.client = client;
        try {
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        start();
    }

    public void run() {
        try {
            System.out.println(in.readLine());
            out.write("Test");

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

}

und der Client:
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class A1Client {
    public static void main(String[] args) {
        System.out.println("Bitte geben Sie eine Funktion ein wie 2x3");

        Socket client = null;
        try {
            client = new Socket("localhost", 4242);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
            Scanner scanner = new Scanner(System.in);
            String tmp = scanner.next();
            if (tmp != null) {
                out.write(tmp);
            } else
                System.out.println("Fehler");

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

    }
}

Kann man sich das irgendwie vernünftig merken wie das mit den InputStreams auf Seiten Server oder Client erstellt wird? Verstehe da gerade nur Bahnhof.
Des weiteren stehe ich gerade vor dem Problem, was ist wenn sich noch ein PC mit meinem Taschenrechner (später) verbindet. Dann treten derzeit doch sämtliche Probleme auf die man auch aus der Parallelen Programmierung only im PC kennt. Sprich ich müsste die run-Methode synchronisieren im Handler oder? Bzw. dafür sorgen das diese Methode immer nur dann betreten werden darf wenn nicht gerade ein anderer Client am werkeln ist ODER?

Mit RMI möchte ich mich auch noch beschäftigen ;-) doch erst einmal noch Sockets halbwegs verstehen ^.^
 

Jw456

Top Contributor
Hallo wo genau bei was habert es denn?
In dem Kleint sehe ich nicht das du etwas abschickist zb mit flush
In Server kein lesen des inputstream und auch kein flush vom outputstream.
 

BodyLAB

Bekanntes Mitglied
Braucht es flush :eek:

Gut das es euch gibt. Wenn man im Client folgendes schreibt:
Java:
if (tmp != null) {
                out.write(tmp);
                out.flush();
            } else
                System.out.println("Fehler");
Kommen plötzlich Daten am Server an. Also benötigt man flush zum übermitteln der Daten. Ich dachte das wäre so wie in C bei der Ein- und Ausgabe unter Windows mit dem Puffer, aus diesem Grund wurde es von mir ignoriert 🙃



____________
Kann man sich das irgendwie merken wozu welcher Stream ist? Also der InputStream im Client ist für ... der OutputStream für ....
Der InputStream im Server ist für ....

Desweiteren würde ich gerne wissen, wie ist es wenn nun mehrere Clients zugriff zum Server haben. Dann benötige ich eine Methode die synchronized ist damit jeder Client nur dann auf dem Server Rechnen darf wenn der erste Client der Rechnen will fertig ist oder :-D
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Input ist Englisch für Eingabe - Also ist der InputStream dazu da, Eingaben (von irgendwo) zu lesen.
Output ist Englisch für Ausgabe - also ist der OutputStream dazu da, Ausgaben (irgendwohin) zu schreiben.

Und das ist immer aus Sicht des aktiven Threads. Also z.B. InputStream im Server: Eingaben lesen. Und hier ist das irgendwo halt vom Socket. Oder OutputStream -> Ausgaben schreiben - und das ist halt dann in / über den Socket.

Flush ist notwendig, denn ansonsten werden Daten so lange zwischengespeichert bis genug Daten da sind um ein Paket voll zu kriegen oder - je nach Methode - gibt es teilweise auch automatisches Absenden. Beim PrintWriter findet sich z.B. die Information:
Unlike the PrintStream class, if automatic flushing is enabled it will be done only when one of the println, printf, or format methods is invoked, rather than whenever a newline character happens to be output. These methods use the platform's own notion of line separator rather than the newline character.
Da Du kein automatisches Flushen aktiviert hast, ist das aber erst einmal egal.

Generell noch der Hinweis: Du solltest Dir immer ein Protokoll überlegen: Wie sehen die Nachrichten aus. Es gibt keine Trennung. Wenn Du also nacheinander schreibst: "Hallo" "Du" "Ich" "bin" "im" "Java-Forum" "aktiv", dann kommt da wirklich diese Zeichenkette an:
"HalloDuIchBinimJava-Forumaktiv".
Und das kann in beliebigen Paketen ankommen, Also der Client kann in einer Schleife evtl. lesen:
"HalloDuI"
"chBinimJa"
"va-Forumaktiv"

(Ist jetzt nicht ganz so - die (Tcp/ip) Pakete sind halt durch eine maximale Größe bestimmt, die auch von Netzwerk zu Netzwerk unterschiedlich sein kann. Angegeben als MTU Maximum Transmission Unit)

Daher ist hier immer ein Protokoll notwendig um Pakete zu Kennzeichnen. Da gibt es viele Ideen:
  • Bei Textbasierten Dingen ist das oft ein Zeilenumbruch
  • Bei Binary Übertragungen kann man als erstes eine Paketgröße mitteilen oder man hat sowas wie ein Marker, der das Ende kennzeichnet.

Das einfach mal als Hinweis.
 

BodyLAB

Bekanntes Mitglied
Daher ist hier immer ein Protokoll notwendig um Pakete zu Kennzeichnen. Da gibt es viele Ideen:
  • Bei Textbasierten Dingen ist das oft ein Zeilenumbruch
  • Bei Binary Übertragungen kann man als erstes eine Paketgröße mitteilen oder man hat sowas wie ein Marker, der das Ende kennzeichnet.

Das einfach mal als Hinweis.
Das ist eine sehr gute Idee.
Ich werde erst einmal versuchen den Taschenrechner zu machen. Wenn der läuft, poste ich hier nochmal :)
Fragen über Fragen hehe
 

BodyLAB

Bekanntes Mitglied
Also leider klappt es überhaupt nicht!
Finde den Fehler nicht.

Server
Java:
public class A1Server {
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket client = null;
        try {
            serverSocket = new ServerSocket(4242);
        } catch (Exception e) {
            System.out.println("Fehler beim Erzeugen des ServerSockets");
            return;
        }

        while (true) {
            try {
                client = serverSocket.accept();
                if (client.isConnected()) {
                    System.out.println("Neuer Spieler connected: " + client.getInetAddress());
                    new A1Handler(client.getInetAddress().getHostName(), client);
                }

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

    }

}

Client
Java:
public class A1Client {
    public static void main(String[] args) {
        System.out.println("Bitte geben Sie eine Funktion ein wie 2x3");

        Socket client = null;
        try {
            client = new Socket("localhost", 4242);
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
            Scanner scanner = new Scanner(System.in);
            String tmp = null;
            if ((tmp = scanner.next()) != null) {
                out.write(tmp);
                out.flush();
            } else
                System.out.println("Fehler");

            System.out.println("Das Ergebnis ist: " + in.readLine());
            
            in.close();
            out.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

Handler
Java:
public class A1Handler extends Thread {

    Socket client;
    String name;
    BufferedReader in;
    PrintWriter out;

    A1Handler(String name, Socket client) {
        this.name = name;
        this.client = client;
        try {
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        start();
    }

    public synchronized void rechnen(String s) {
        int x = Integer.parseInt("" + s.charAt(0));
        char operator = s.charAt(1);
        int y = Integer.parseInt("" + s.charAt(2));
        int erg = 0;

        switch (operator) {
        case '*':
            erg = x * y;
            break;
        case '+':
            erg = x + y;
            break;
        case '-':
            erg = x - y;
            break;
        case ':':
            erg = x / y;
            break;
        default:
            System.out.println("Fehler");
            break;
        }

        out.write(String.valueOf(erg));
        out.flush();
        out.close();
    }

    public void run() {
        try {
            String tmp = in.readLine();
            System.out.println(tmp);
            out.write("Test");
            out.flush();
            
            //rechnen(tmp);
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Ich hab gerade alles weiter auskommentiert, da ich versuche überhaupt einmal ein Test Text von Client an Server und von Server an Client zu senden. Das klappt jedoch einfach nicht!
 

KonradN

Super-Moderator
Mitarbeiter
Du willst immer ganze Zeile lesen. Aber Du schreibst nie eine ganze Zeile.

Zeile lesen heisst, dass bis zu einem Newline gelesen wird. So ein Newline Zeichen kommt aber nie.

Statt write solltest Du ggf. println verwenden. Alternativ kannst Du auch ein "\n" beim write mitsenden.
 

Jw456

Top Contributor
Java:
    public synchronized void rechnen(String s) {
Frage welcher ander Thread greift denn hier zu? Du erstellst doch mit jeden User ein neues Objekt vom "A1Handler"
 

BodyLAB

Bekanntes Mitglied
Jawohl das hat mein Problem gelöst.

Frage welcher ander Thread greift denn hier zu? Du erstellst doch mit jeden User ein neues Objekt vom "A1Handler"
Das stimmt, doch wie geht das dann anders? Also so das man da etwas synchronisieren muss? Oder ist das üblich so, das immer ein neues Objekt erstellt wird auf allen Servern auf der Welt?
 

KonradN

Super-Moderator
Mitarbeiter
Das stimmt, doch wie geht das dann anders? Also so das man da etwas synchronisieren muss? Oder ist das üblich so, das immer ein neues Objekt erstellt wird auf allen Servern auf der Welt?
Synchronisieren musst Du nur Zugriffe auf gemeinsame Daten.

Du erzeugst für jeden Client ja mindestens eine Instanz, die alle wichtigen Details hält. Das ist mind. der Socket für den Client (Oder der Channel, wenn Du nio Packages nutzt um nicht die vielen Threads zu haben).

Hier hast Du ja nicht wirklich (gemeinsame) Daten. Du hast ja nur eine Nachricht, die Du dann auswertest um ein Ergebnis zurück zu senden.

Wenn Du eine zentrale Rechner-Instanz hättest, die alle Clients nutzen würden, dann wäre ggf. eine Synchronisierung notwendig. Aber auch das nur, wenn Du den Status der Rechner Instanz veränderst.

Deine Methode Rechnen macht ja nur etwas mit den Parametern / lokalen Variablen. Da wäre eine Synchronisation nie notwendig.

da deine streamvariablen nicht im Thread sind.
Was willst Du mir oder dem TE sagen? Sein Problem, das dann gelöst war, war schlicht und ergreifend die nicht gesendeten Newlines so dass nie eine ganze Zeile gelesen werden konnte.
 

Jw456

Top Contributor
Synchronisation Thread Sicherheit würdest du brauchen wenn du etwas aufrufst was alle User nutzen können. Zb eine Datenbank die ja dann nicht in dem User-Thread läuft.

Du hast ja deine gesamte Logik in dem Thread.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
T HTMLUNIT Formularfüll Versuch Netzwerkprogrammierung 3
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
W Socket Server -> lesen von / schreiben zu php-script Netzwerkprogrammierung 6
G Socket Socket Kommunikation Netzwerkprogrammierung 1
L Server-Socket liest Input-Stream nicht Netzwerkprogrammierung 5
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
D Socket-Verbindungen übers Internet Netzwerkprogrammierung 4
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
N Java socket Programmierung Filme verschicken Netzwerkprogrammierung 20
A TCP multiClientServer mit socket mittels ObjectOutputStream Netzwerkprogrammierung 12
A Socket-Anwendung (BufferedWriter/Reader liest nicht aktuellen Wert) Netzwerkprogrammierung 6
platofan23 Socket Java Socket mit DynDns nicht erreichbar Netzwerkprogrammierung 6
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
M Socket Socket lehnt Verbindung ab Netzwerkprogrammierung 3
x46 Connection reset by peer: socket write error Netzwerkprogrammierung 6
x46 Socket Files per Socket verschicken Netzwerkprogrammierung 1
platofan23 Probleme mit Socket bei Android Studio? Netzwerkprogrammierung 22
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
D new ObjectInputStream(socket.getInputStream()); Netzwerkprogrammierung 15
E Socket Frage Netzwerkprogrammierung 6
D ServerSocket - Socket Verbindungsart Netzwerkprogrammierung 3
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
F TCP Socket auf Verbindungsabbruch prüfen Netzwerkprogrammierung 15
F Socket Verbindung mit Verschlüsselung und Authentifierzung Netzwerkprogrammierung 1
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
T Socket Socket connections schließen? Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
F Socket Socket in anderen Methoden Netzwerkprogrammierung 1
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
I Socket Netzwerkprogrammierung 1
F Wiederverbinden nach socket Abbruch Netzwerkprogrammierung 1
J 1 Socket - 2 Serversocket Netzwerkprogrammierung 4
T Socket sendet erst nach socket.close() Netzwerkprogrammierung 2
F Socket Verbindungsaufbau abbrechen Netzwerkprogrammierung 3
P Socket Socket-Verbindung Input sehr langsam Netzwerkprogrammierung 1
I Socket Kommunikation C / Java Netzwerkprogrammierung 2
Joew0815 socket event handler Netzwerkprogrammierung 2
F Einfache Socket Verbindung Netzwerkprogrammierung 2
A Socket Socket Receive-/SendBuffersize Netzwerkprogrammierung 0
D Socket server auf Smartphone Netzwerkprogrammierung 9
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
A Socket Socket Server netcat Netzwerkprogrammierung 1
Shams Anfängerfrage zu Server-Socket-Kommunikation Netzwerkprogrammierung 2
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
D Socket Error: java.lang.NullPointerException Netzwerkprogrammierung 1
D TCP Socket funktioniert nicht richtig Netzwerkprogrammierung 3
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
B SSL Socket Netzwerkprogrammierung 2
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
R Dauerhaft offene Socket-Verbindung? Netzwerkprogrammierung 3
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
P Warum kann ich kein Socket aufbauen? Netzwerkprogrammierung 12
S Socket SSL Socket und Sun/Oracle Java Netzwerkprogrammierung 5
S Socket Socket Verbindung wiederherstellen Netzwerkprogrammierung 16
precoc Server Socket Start / Stop Netzwerkprogrammierung 5
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
C Socket Systemsperren mit Socket Netzwerkprogrammierung 4
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
D Socket Multithread-Socket | Kurz vor dem Ziel Netzwerkprogrammierung 7
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
D Socket Socket absichtlich so schließen, dass Gegenseite java.net.SocketException: Connection reset wirft Netzwerkprogrammierung 4
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
A UDP verlorene Pakete/ socket.receive zu langsam Netzwerkprogrammierung 27
CookieSoft Socket Packet per Socket Netzwerkprogrammierung 8
CookieSoft Fehler bei Socket Netzwerkprogrammierung 4
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
T Per Socket auf POP3 zugreifen? Netzwerkprogrammierung 7
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T Socket String zu Socket Netzwerkprogrammierung 26
M Datenübertragung per Socket nur alle 200ms Netzwerkprogrammierung 4
C Socket Socket: Connection timed out Netzwerkprogrammierung 3
T Socket blockierter Socket Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
T Alternative Socket mit Verbindungsabbruch Erkennung Netzwerkprogrammierung 2
M Socket, Ende Dateitransfer Netzwerkprogrammierung 4
X Über eine Socket-Verbindung Arrays übergeben Netzwerkprogrammierung 5
D RMI oder Socket Netzwerkprogrammierung 4
H Socket Socket listening Netzwerkprogrammierung 11
D Client Socket mit Eventlistener? Netzwerkprogrammierung 5
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
A Socket Netzwerkprogrammierung 18
N Socket geht auf Windows, aber auf Mac nicht ? Netzwerkprogrammierung 3
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
G Exception: Connection reset by peer: socket write error Netzwerkprogrammierung 2
M SSl Socket Server und openssl key Netzwerkprogrammierung 3
J Socket Socket Programmierung. Wie anfangen? Netzwerkprogrammierung 4
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben