2016-11-26 4 views
0

Я написал программу «Простой серверный клиент», и когда я запускаю сервер и клиент, клиент получает сообщение, которое он отправил на сервер и завершает сам. Но когда я запускаю другого Клиента, он не возвращает сообщение. Зачем? Спасибо большое!Java Почему сервер не отвечает на второго клиента?

Первый класс: клиент

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class StringClient { 

    public static void main(String[] args) { 

     Socket socket = null; 
     try{ 
      socket = new Socket("localhost", 3141); 

      OutputStream raus = socket.getOutputStream(); 
      PrintStream ps = new PrintStream(raus, true); 
      System.out.println("1"); 
      ps.println("Hello World!"); 
      ps.println("Hello Universe!"); 

      InputStream rein = socket.getInputStream(); 
      System.out.println("verf\u00FCgbare Bytes: " + rein.available()); 
      BufferedReader br =new BufferedReader(new InputStreamReader(rein)); 
      System.out.println(2); 

      while(br.ready()){ 
       System.out.println(br.readLine()); 
      } 


     }catch(UnknownHostException e){ 
      System.out.println("Unknown Host..."); 
      e.printStackTrace(); 

     } catch (IOException e) { 
      System.out.println("IOProbleme..."); 
      e.printStackTrace(); 
     }finally{ 
      if(socket != null){ 
       try{ 
        socket.close(); 
        System.out.println("Socket geschlossen..."); 
       }catch(IOException e){ 
        System.out.println("Fehler beim Schließen des Sockets!"); 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

} 

Второй класс: Сервер

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class StringServer { 
    private final ServerSocket server; 

    public StringServer(int port) throws IOException { 
     server = new ServerSocket(port); 
    } 


    private void connect(){ 

     while(true){ 
      Socket socket = null; 
      try{ 
       socket = server.accept(); 
       reinRaus(socket); 
      }catch(IOException e){ 
       e.printStackTrace(); 
      }finally{ 
       if(socket != null){ 
        try{ 
         socket.close(); 
        }catch(IOException e){ 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

    private void reinRaus(Socket socket) throws IOException{ 
     BufferedReader rein = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     PrintStream raus = new PrintStream(socket.getOutputStream()); 
     String s; 

     while(rein.ready()){ 
      s = rein.readLine(); 
      raus.println(s); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     StringServer server = new StringServer(3141); 
     server.connect(); 
    } 


} 
+0

@davidbox Ваше заявление о 'готовности()' перенастройки верно, когда он не находится в вашем удаляемого ответа завершена бред какой то. Пожалуйста, не повторяйте это. – EJP

ответ

0

Основной поток должен выделяет отдельные/разные потоки для входящих клиентов, поэтому различные клиенты получают выделены для разных потоков (они получают разные сокеты). В вашем текущем коде есть только сервер, обслуживающий клиента.

StringServer.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class StringServer { 
    private final ServerSocket server; 

    public StringServer(int port) throws IOException { 
     server = new ServerSocket(port); 
    } 


    private void connect(){ 

     while(true){ 
      Socket socket = null; 
      try{ 
       socket = server.accept(); 


       clientHandler ch = new clientHandler(socket); 
        ch.start(); 



      }catch(IOException e){ 
       e.printStackTrace(); 
      }finally{ 
       if(socket != null){ 
        try{ 
         socket.close(); 
        }catch(IOException e){ 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 



    public static void main(String[] args) throws IOException { 
     StringServer server = new StringServer(3541); 
     server.connect(); 
    } 


} 
class clientHandler extends Thread { 

    Socket client; 


    public clientHandler(Socket client) { 
     this.client = client; 
    } 

    @Override 
    public void run() { 

     try { 

      BufferedReader rein = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     PrintStream raus = new PrintStream(client.getOutputStream(),true); 
     String s; 

     while(rein.ready()){ 
      s = rein.readLine(); 
      raus.println(s); 
     } 
      client.close(); // IOException 

     } catch (IOException e) { 
     } 

    } 

} 

StringClient.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class StringClient { 

    public static void main(String[] args) { 

     Socket socket = null; 
     try{ 
      socket = new Socket("localhost", 3541); 

      OutputStream raus = socket.getOutputStream(); 
      PrintStream ps = new PrintStream(raus, true); 
      System.out.println("1"); 
      ps.println("Hello World!"); 
      ps.println("Hello Universe!"); 

      InputStream rein = socket.getInputStream(); 
      System.out.println("verf\u00FCgbare Bytes: " + rein.available()); 
      BufferedReader br =new BufferedReader(new InputStreamReader(rein)); 
      System.out.println(2); 

      while(br.ready()){ 
       System.out.println(br.readLine()); 
      } 


     }catch(UnknownHostException e){ 
      System.out.println("Unknown Host..."); 
      e.printStackTrace(); 

     } catch (IOException e) { 
      System.out.println("IOProbleme..."); 
      e.printStackTrace(); 
     }finally{ 
      if(socket != null){ 
       try{ 
        socket.close(); 
        System.out.println("Socket geschlossen..."); 
       }catch(IOException e){ 
        System.out.println("Fehler beim Schließen des Sockets!"); 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

}