2017-10-03 24 views
1

J'ai écrit un programme, qui implémente une simple connexion serveur-client et la communication, mais cela ne fonctionne qu'avec un client. Si je démarre un deuxième client, il ne fait rien mais donne "Out: 0" comme sortie. (Le serveur n'y répond pas)Java - Serveur sert plusieurs clients en même temps

J'utilise Threads sur mon serveur, mais je n'arrive pas à comprendre pourquoi cette solution ne fonctionne pas.

Une idée?

(Je sais que les prises es ne sont pas assez vide, mais il est juste un exemple de code.)

Server.java:

public class Server implements Runnable { 
final int port; 

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

@Override 
public void run(){ 
    while(true){ 
    try{ 
     ServerSocket ss = new ServerSocket(port); 
     new ClientThread(ss).start(); 
    }catch(Exception e){} 
    } 
} 

public static void main(String[] args){ 
    new Server(1995).run(); 
} 

private class ClientThread extends Thread{ 
    Socket s; 
    Scanner sc; 
    PrintWriter pw; 

    ClientThread(ServerSocket ss){ 
     try{ 
      this.s = ss.accept(); 
     }catch(Exception e){} 
    } 

    @Override 
    public void start(){    
     try{ 
      String in,out; 

      sc = new Scanner(s.getInputStream()); 
      pw = new PrintWriter(s.getOutputStream(), true); 
      int i=0; 
      do{ 
       in = sc.nextLine(); 
       System.out.println("In: " + in); 
       int tmp = Integer.parseInt(in)+1; 
       out = Integer.toString(tmp); 
       pw.println(out); 
       i++; 
      }while(i<10); 
     }catch(Exception e){} 
    } 
} 
} 

Client.java:

public class Client implements Runnable{ 
String host; 
int port; 
Socket s; 
Scanner sc; 
PrintWriter pw; 

public Client(String host, int port){ 
    this.host=host; 
    this.port=port; 
} 

@Override 
public void run(){ 
    try{ 
     s = new Socket(host, port); 

     sc = new Scanner(s.getInputStream()); 
     pw = new PrintWriter(s.getOutputStream(), true); 

     String in, out; 
     out="0"; 
     int i=0; 
     do{ 
      pw.println(out); 
      System.out.println("Out: " + out); 
      in = sc.nextLine(); 
      int tmp = Integer.parseInt(in)+1; 
      out=Integer.toString(tmp); 
     }while(i<10); 

    }catch(Exception e){} 
} 

public static void main(String[] args){ 
    new Client("localhost", 1995).run(); 
} 
} 

Répondre

0

Vous ne devez pas remplacer start(), vous devez remplacer run()

private class ClientThread extends Thread{ 
    Socket s; 
    Scanner sc; 
    PrintWriter pw; 

    ClientThread(Socket s){ 
     this.s = s; 
    } 

    @Override 
    public void run() { 
     try{ 
      String in,out; 

      sc = new Scanner(s.getInputStream()); 
      pw = new PrintWriter(s.getOutputStream(), true); 
      int i=0; 
      do{ 
       in = sc.nextLine(); 
       System.out.println("In: " + in); 
       int tmp = Integer.parseInt(in)+1; 
       out = Integer.toString(tmp); 
       pw.println(out); 
       i++; 
      }while(i<10); 
     }catch(Exception e){} 
    } 
} 

fil du serveur:

@Override 
public void run(){ 
    try{ 
     ServerSocket ss = new ServerSocket(port); 
     while(true){ 
      Socket cl = ss.accept(); 
      new ClientThread(cl).start(); 
     } 
    }catch(Exception e){} 
} 
+0

Oh, je vous remercie. Mais cela ne résout pas mon problème. :( – SummerFlower

+0

Accepter() doit appeler dans le fil du serveur –

+0

Ça va, je l'ai amélioré avec mon code, mais ça ne marche qu'avec un seul client Quand le premier client est fini c'est tâche, je peux commencer un second, mais si le le premier fonctionne, le second ne fera rien d'autre que "Out: 0" – SummerFlower