java. net.SocketException: Socket est fermé entre Socket.accept() et de la Prise.getInputStream()


J'essaie de créer une connexion client/serveur et je suis également assez nouveau sur java. Donc, l'erreur que je reçois me dit que le socket est fermé. Après quelques travaux, j'ai réussi à écrire le code donné ci-dessous. Je crois qu'il y a quelque chose de mal avec la façon dont je passe le socket à la classe de connexion, si je devais deviner, cela provoque la fermeture éventuelle de l'objet socket?

J'ai essayé d'ajouter waits juste au cas où le thread du serveur n'aurait pas été exécuté mais ce n'est pas le cas semblent influer sur quoi que ce soit. Peut-être que je devrais lancer le serveur avec son propre lanceur dans sa propre invite de commande, mais je pense que cela devrait très bien fonctionner pour tester le client et le serveur.

Je n'arrive pas à trouver pourquoi mon socket est fermé avant d'envoyer mon message. Toute idée serait grandement appréciée!

Merci!

Erreur

java.net.SocketException: Socket is closed
    at java.net.Socket.getInputSTream(Unknown Source)
    at Connection.run(Connection.java:17)

Serveur.java

//main calling snippet. 
import java.lang.Thread;

public class Server {
    public static void main(String[] args) {
        if(args.length != 1) {
            System.err.println("Usage: java Server <port number>");
            System.exit(1);
        }

        int port = Integer.parseInt(args[0]);
        Thread server = new KServer(port);
        server.start();
        //added waits just to make sure the thread was executed? 
        //thinking this might be my problem
        long t = System.currentTimeMillis() + 5000;
        while (System.currentTimeMillis() < t) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        KClient client = new KClient("127.0.0.1",port);
        while (!(client.openConn())) {
            System.out.println("Failed to connect.  Retrying...");
        }
        client.send("Hello World");
        client.closeConn();

    }
}

KServer.java

//the actual server class that manages listening and threading the sockets
import java.net.*;
import java.io.*;

public class KServer extends Thread {

    private int port;
    private ServerSocket sSock;

    public KServer(int thisPort) {
        port = thisPort;
        try {
           sSock = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();            
        }
    }

    public void run() {
        while(true) {
            try (Socket cSock = sSock.accept();) {
                Thread con = new Connection(cSock);
                con.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

Connexion.java

//Manages sending and receiving messages

import java.net.Socket;
import java.io.*;

public class Connection extends Thread {

    Socket socket;

    public Connection(Socket s) {
        socket = s;
    }

    public void run() {     
        String msg;
        BufferedReader in;
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while((msg = in.readLine()) != null) {
                System.out.println(msg);
            }   
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

KClient.java

//manages the clients connection life to the server
import java.net.*;
import java.io.*;

public class KClient {

    private Socket sock;
    private String dest;
    private int port;

    private OutputStreamWriter out;

    public KClient(String dst,int prt) {
        dest = dst;
        port = prt; 
    }

    public boolean openConn() {

        try {
            sock = new Socket(dest,port);
            out = new OutputStreamWriter(sock.getOutputStream(),"ISO-8859-1");          
        } catch (Exception e) {
            e.printStackTrace();
            return false;

        }
        return true;
    }

    public void send(String msg) {
        try {
            out.write(msg);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void closeConn() {

        try {
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



}
Author: Am_I_Helpful, 2016-02-28

1 answers

N'utilisez pas try-with-resources pour accepter le socket. Il fermera le socket accepté, qui doit rester ouvert pour que le thread de manipulation puisse l'utiliser. Le fil de manipulation est responsable de sa fermeture.

 2
Author: user207421, 2016-02-28 19:21:59