Outputstream von anderem Thread verwenden lassen

Status
Nicht offen für weitere Antworten.

PAX

Mitglied
Hallo Freunde.

Ich finde zu meinem Problem keine Lösung. Aber vielleicht habt ihr damit bereits Erfahrung gemacht.

Ich versuche mit den Klassen, Socket und ServerSocket, ein einfaches Anfrage-/Antwortszenario zu realisieren. Sofern beide Programme (Server und Client) direkt miteinander kommunizieren, klappt das auch. Doch sobald ich den Server bei jeder Anfrage einen neuen Thread erzeugen lasse, der dann in den Outputstream schreiben soll, scheint er unendlich lange zu schreiben, bzw. nie zum Ende zu kommen. Ich habe zum einen probiert, lediglich eine Referenz auf das BufferedOutputStream-Objekt an den neuen Thread zu übergeben und zum anderen versuchte ich es damit, die Referenz des von der accept-Methode zurückgelieferten Socket-Objektes dem neuen Thread zu geben. Beides leider nachwievor erfolglos. Bei zweiterer Variante funktioniert noch nicht einmal das einlesen der Anfrage-Bytes.

Server erzeugen nunmal für jede Anfrage einen seperaten Thread. Doch wie soll ich das realisieren, wenn dann die Streams nicht mehr funktionieren?

Hier der (vereinfachte) Clientcode zur ungefähren Illustration:
Code:
Socket server = null;
            try
            {
                        server = new Socket("paxnotebook", 23235);
                        BufferedInputStream in = new BufferedInputStream(server.getInputStream());
                        BufferedOutputStream out = new BufferedOutputStream(server.getOutputStream());
                        
                        out.write(86);
                        out.flush();
                        System.out.println("Antwort: "+in.read());
...

Hier der Server (vereinfacht):
Code:
        Socket client = null;
        ServerSocket serverSocket = new ServerSocket(23235);
...
        while (true)
        {
                client = serverSocket.accept();

                if (client != null)
                {
                    new Test(client);
                    client = null;
                }
        }
...

Der neu erzeugte Thread:
Code:
private Socket client;

    public Test(Socket client)
    {
        this.client = client;
        //this.setDaemon(true);
        this.start();
    }

    @Override
    public void run()
    {
        try
        {
            System.out.println("Anfrage wird verarbeitet...");
            BufferedInputStream in = new BufferedInputStream(client.getInputStream());
            BufferedOutputStream out = new BufferedOutputStream(client.getOutputStream());
            StringBuffer inpStream = new StringBuffer();
            for (int b = in.read(); b != -1; b = in.read())
                inpStream.append((char) b);

            System.out.println("Anfrage erhalten: " + inpStream);
            out.write(23);
            out.flush();
...


Nun bin ich gespannt. :)

Beste Grüße


PAX
 

Murray

Top Contributor
javadoc hat gesagt.:
java.io.InputStream.read

public abstract int read()
throws IOException

Reads the next byte of data from the input stream. The value byte is returned as an int in the range 0 to 255. If no byte is available because the end of the stream has been reached, the value -1 is returned. This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

Warum also sollte dieser Code
Code:
for (int b = in.read(); b != -1; b = in.read())
jemals terminieren?
 

PAX

Mitglied
weil b irgendwann der wert -1 zugewiesen wird (sobald keine daten mehr kommen) und dann die schleifenbedingung nicht mehr erfüllt ist.
 

PAX

Mitglied
ähm... ich bin gerade "etwas" verwirrt... lasse ich das einlesen der daten vom client ganz sein, komme ich auch beim code mit dem senden der antwort an, die der client dann auch erhält...

ich kann aber wirklich nicht nachvollziehen, warum das einlesen der anfragebytes vom client nicht funktioniert? ersetze ich das for-konstrukt durch folgende alternative:

Code:
int b;
            do
            {
                b = in.read();
                if (b != -1) inpStream.append((char) b);
            }while(b != -1);
            //for (int b = in.read(); b != -1; b = in.read())

funktionierts ebenfalls nicht.

was ist denn blos los? hab ich einen knick im gehirn? :(

beste grüße


PAX


NACHTRAG:
ich hab innerhalb der schleife einmal ausgeben lassen, was b denn so erhält. und mit verwunderung stelle ich fest, dass es immer genau das bekommt, was der client auch an den server an bytes gesendet hat. allerdings scheint die schleife am ende der zu übertragenden bytes dann offensichtlich einzufrieren.
das kann ich, ehrlich gesagt, nicht verstehen. denn müsste nicht zum schluss -1 zurückgeliefert werden? das beendet doch die schleife?
 

Murray

Top Contributor
PAX hat gesagt.:
weil b irgendwann der wert -1 zugewiesen wird (sobald keine daten mehr kommen) und dann die schleifenbedingung nicht mehr erfüllt ist.
Genau das ist der Punkt: der Stream kann ja nicht riechen, dass keine Daten mehr kommen - wann sollte er denn abbrechen? Nach 10 Millisekunden? Nach 100 Millisekunden? Oder erst nach 5 Minuten?
Bei einen FileInputStream oder einen ByteArrayInputStream ist das anders; dort kann der InputStream wissen, wann nichts mehr kommen kann; bei diesen Streams wird read dann auch irgendwann -1 liefern. Bei einem SocketInputStream geht das nicht, denn die empfangende Seite kann ja nicht wissen, ob der Sender nicht im nächsten Moment noch etwas schicken wird.
 

PAX

Mitglied
darauf wäre ich (wenn überhaupt) lange nicht gekommen. :)

ich danke dir, Murray!

beste grüße


PAX
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T OutputStream kommt nicht an Netzwerkprogrammierung 18
L Socket Wie kann ich checken ob ein User eine Nachricht per Outputstream an den Server gesendet hat? Netzwerkprogrammierung 1
S FTP OutputStream Timed out Netzwerkprogrammierung 2
D Socket Socket OutputStream leeren? Netzwerkprogrammierung 3
Seikuassi Socket CipherInput/OutputStream empfängt nichts Netzwerkprogrammierung 23
C Inhalt einer .JPG Datei in einen OutputStream schreiben? Netzwerkprogrammierung 10
E Socket Outputstream - chunks groeße bestimmen. Netzwerkprogrammierung 3
T Socket ObjectIn/OutputStream Netzwerkprogrammierung 3
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
H Input-/OutputStream Frage Netzwerkprogrammierung 6
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
P Probleme mit OutputStream Netzwerkprogrammierung 7
M Verbindung über Proxy// Problem mit Outputstream bei URLConn Netzwerkprogrammierung 5
T Filter für Input UND OutputStream Netzwerkprogrammierung 4
Y Inhalt aus Textfield in OutputStream packen Netzwerkprogrammierung 4
bummerland Cookies über OutputStream senden Netzwerkprogrammierung 2
S XAMPP auf anderem Rechner erreichen Netzwerkprogrammierung 6
C Serverzugriff über Internet, Server in anderem Bussystem Netzwerkprogrammierung 9
OnDemand Thread und Ratelimiter Netzwerkprogrammierung 4
F Thread "extern" beenden Netzwerkprogrammierung 3
OnDemand Linux RAM per Thread Netzwerkprogrammierung 3
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
C Thread Netzwerkprogrammierung 9
platofan23 Socket Hilfe mit Socket Thread und ArrayList Netzwerkprogrammierung 6
A RMI RMI - Thread Objekte übertragen und auf anderer Machine weiterlaufen lassen Netzwerkprogrammierung 0
S Socket ThreadPool oder Thread pro Client? Netzwerkprogrammierung 11
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
P Wie spreche ich einen Thread an? Netzwerkprogrammierung 20
M Thread Scheduler Java 5.0? Netzwerkprogrammierung 2
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
D Socket Dynamische Socket-Thread Erzeugung Netzwerkprogrammierung 2
B Socket Thread handling / Reader init Netzwerkprogrammierung 8
Z Socket Socket-Thread falsch? Netzwerkprogrammierung 5
Helgon Socket Thread Pooling Netzwerkprogrammierung 6
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
B callback thread udp Netzwerkprogrammierung 2
D RMI und Thread Netzwerkprogrammierung 4
S Kommunikationsproblem, Thread und manuel Netzwerkprogrammierung 4
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
K ein Thread pro Stream Netzwerkprogrammierung 2
D Weiterer Thread auf Port 843 horcht Netzwerkprogrammierung 7
D Thread problem Netzwerkprogrammierung 3
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Thread Transport Netzwerkprogrammierung 6
S Socket Thread in Schleife Netzwerkprogrammierung 4
G Objekte per TCP verschicken + Thread Netzwerkprogrammierung 4
T synchronized mit thread und rückgabe Netzwerkprogrammierung 4
Q Thread und Sockets... Netzwerkprogrammierung 2
2 Class mit ServerSocket erbt von Thread? Netzwerkprogrammierung 3
C Server mit Multithreading (Thread-Pool) Netzwerkprogrammierung 2
E java.lang.NullPointerException aber nur wenns im Thread läuf Netzwerkprogrammierung 4
F EIN Thread in RMI auf Serverseite Netzwerkprogrammierung 3
G Server Thread beenden Netzwerkprogrammierung 16
T Socket-Thread: Designfrage Netzwerkprogrammierung 14
S Mit Thread arbeitende Maschine Netzwerkprogrammierung 6
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
K Selbe Streams mehrfach nutzen (zusätl. Thread) Netzwerkprogrammierung 6
ven000m Thread Frage Netzwerkprogrammierung 11
B Thread.start() (run()) excption Netzwerkprogrammierung 2
M Thread läuft nicht weiter Netzwerkprogrammierung 2
B NullPointerException | Thread Netzwerkprogrammierung 4
U Current thread not owner Netzwerkprogrammierung 3
S readline-thread stoppt vorzeitig Netzwerkprogrammierung 6
J RMI - (RemoteException occurred in server thread) Netzwerkprogrammierung 2
S Webserverprogrammierung: Thread-Beschränkung Netzwerkprogrammierung 2
M Exception in thread "main" java.lang.NoClassDefFou Netzwerkprogrammierung 2
F problem mit thread bzw. netzwerkverbindung! Netzwerkprogrammierung 3
L netzwerk mit thread Netzwerkprogrammierung 3
G RMI thread safe ? Netzwerkprogrammierung 11
A Thread gibt Nachrichten mehrmals aus (Messenger in Java) Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben