Java java.net.SocketException: Socket is closed

F

Furtano

Gast
Nachdem ich die erste Eingabe an den Server schicke bekomme ich die Meldung:

PHP:
Apr 29, 2012 9:24:21 PM parksockets.Client send
Schwerwiegend: null
java.net.SocketException: Socket is closed


Eingabe: 
	at java.net.Socket.setSoTimeout(Socket.java:1089)
	at parksockets.Client.send(Client.java:57)
	at parksockets.ParkSockets.main(ParkSockets.java:62)

ParkSockets.java
PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package parksockets;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author chris
 */
public class Client {

    public int port;
    public InputStream in;
    public OutputStream out;
    public  Socket sock;
    public Client() {
        port = 6700;
        

    }

    public void startClient() {



        try {
            //InetAddress ip = InetAddress.getLocalHost();

            sock = new Socket("127.0.0.1", port);
            in = sock.getInputStream();
            out = sock.getOutputStream();
            
            

            // Verbindungen schliessen
            in.close();
            out.close();
            sock.close();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    
    public void send (String command){
        try {
            // Timeout setzen
            sock.setSoTimeout(300);
            // Kommando an Server schicken
            out.write(command.getBytes());
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Client.java
PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package parksockets;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author chris
 */
public class Client {

    public int port;
    public InputStream in;
    public OutputStream out;
    public  Socket sock;
    public Client() {
        port = 6700;
        

    }

    public void startClient() {



        try {
            //InetAddress ip = InetAddress.getLocalHost();

            sock = new Socket("127.0.0.1", port);
            in = sock.getInputStream();
            out = sock.getOutputStream();
            
            

            // Verbindungen schliessen
            in.close();
            out.close();
            sock.close();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
    }

    
    public void send (String command){
        try {
            // Timeout setzen
            sock.setSoTimeout(300);
            // Kommando an Server schicken
            out.write(command.getBytes());
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}


Server.java
PHP:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package parksockets;

import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author chris
 */
public class Server extends Thread {

    public int port;
    private boolean stoprequestet;

    public Server() {

        port = 6700;
        stoprequestet = false;
    }

    public synchronized void requestStop() {
        stoprequestet = true;
    }

    public void run() {
        try {
            ServerSocket serversock = new ServerSocket(port);
            int a = 0;
            System.out.println(a);
            // ab hier wartet der Server auf eine Verbindung
            Socket useSocket = serversock.accept();


            InputStream in = useSocket.getInputStream();
            OutputStream out = useSocket.getOutputStream();

            byte[] b = new byte[100];
            int len;

            try {
                int i = 0;
                while (!stoprequestet) {
                   
                    try {
                        if ((len = in.read(b)) == -1) {
                            break;
                        }
                        System.out.write(b, 0, len);

                    } catch (InterruptedIOException e) {
                    }

                }
            } catch (IOException e) {
                System.err.println(e.toString());
            }
            /*
             * if (in.read(b) == "in"){
             *
             * }
             *
             */

            // Verbindungen schliessen
            in.close();
            out.close();
            useSocket.close();
            serversock.close();


        } catch (IOException e) {
            System.err.println(e.toString());

        }

    }
}
 
Versuch mal die Reihenfolge der beiden Anweisungen zu tauschen (in Server und Client):
Code:
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
(hab einfach mal socket als Variable genommen, hat entsprechend anpassen)

Hier kann eine Art Dead-Lock entstehen...
Grund:
Der Server wartet auf den Eingabe-Stream vom Client. D.h. er wartet darauf, dass der Client einen Ausgabe-Stream erzeugt. Der ist aber selbst damit beschäftigt, auf den Eingabe-Stream vom Server zu warten, der aber nicht erstellt wird, da der Server ja wartet...

Vereinfacht gesagt: Es gilt das U-Bahn-Prinzip: Erst die Leute rauslassen (outstream) und dann einsteigen (instream)

Ich weiß allerdings nicht, ob das das Problem löst ^^


Hilfreich wäre es übrigens, wenn du nicht zwei mal die Client-Klasse gepostet hättest...


Edit------------------------------------
Eigentliche Ursache:
Warum werden in Client.startClient() die Streams und der Socket eigentlich sofort wieder geschlossen? oO
 
Zuletzt bearbeitet:
Da haben wir nämlich auch das Problem, dass du die Socket aufmachst, aber im gleichem Atemzug wieder schließt. Ergibt natürlich irgendwie gar keinen Sinn, daher solltest du die close-Methoden in eine andere Methode auslagern und es sollte funktionieren.
 

Ähnliche Themen

Zurück
Oben