2014-12-19 7 views
0

Сейчас мой сервер может обрабатывать только одного клиента за раз. Я пытаюсь использовать Thread, чтобы сервер мог обрабатывать несколько клиентов, но я делаю это неправильно. Я добавил поток в предложение try/catch, где serverSocket принимает клиента, но это не имеет никакого значения. Я не получаю ошибку или что-то еще, но она просто не работает. Так что я хочу сделать, это сделать сервер не замороженным на одном клиенте, но все же принять несколько клиентов.Обработка большего количества клиентов

Вот код сервера:

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

public class Server { 

    private BufferedReader reader; 
    private PrintWriter writer; 
    private int port; 

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

    private String getSeverAddress() {  
     String host = null; 
     try { 
      InetAddress adr = InetAddress.getLocalHost(); 
      host = adr.getHostAddress(); 

     } catch (UnknownHostException e) {   
      e.printStackTrace(); 
     } 

     return host; 
    } 

    public void startServer() { 

     print("Contact this sever on address: " + getSeverAddress() + " port: " + port); 

     ServerSocket ss = null; 
     Socket socket = null; 
     Thread clientThread = null; 


     try { 
      ss = new ServerSocket(port); 
      socket = ss.accept();        

      clientThread = new Thread(new Client(socket)); 
      clientThread.start(); 

      reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      writer = new PrintWriter(socket.getOutputStream(), true); 

      String msg = null; 

      while ((msg = reader.readLine()) != null) { 
       print("System out: " + msg);  

       if(msg.equals("Bye")) { 
        print("Client left"); 
        break; 
       } 
      } 

      ss.close(); 
      socket.close(); 
      reader.close(); 
      writer.close(); 

     } catch(SocketException e) { 
      e.printStackTrace();    
     } catch (IOException i) { 
      i.printStackTrace(); 
      return; 
     } 

    }  

    private void print(String msg) { 
     System.out.println(msg); 
    } 

    public static void main(String[] args) { 

     Server server = new Server(1111); 
     server.startServer(); 

    } 
} 

Вот код клиента:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class Client implements Runnable{ 

    private Socket client; 
    private BufferedReader reader; 
    private PrintWriter writer; 

    public Client(Socket socket) 
    { 
     client = socket; 

     try{ 
      reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      writer = new PrintWriter(client.getOutputStream(), true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 
    } 

    @Override 
    public void run() { 

     String msg = null; 
     BufferedReader r = null; 

     try { 
      r = new BufferedReader(new InputStreamReader(System.in)); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 

     System.out.println("Write message to server"); 

     while(true) { 
      try { 
       msg = r.readLine(); 

       if(msg.equals("Quit") || msg == null) { 
        print("Disconnect"); 
        break; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      writeToServer(msg);       
     } 

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

    public void writeToServer(String msg) {      
     writer.println(msg);     
    } 

    private void print(String msg) { 
     System.out.println(msg); 
    } 

    public static void main(String[] args) { 
     Socket socket = null; 

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

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     Client client = new Client(socket); 
     client.run(); 
    } 

} 

ответ

0

Вы должны положить ss.accept() в время цикла и создать новую тему для каждого клиента принято, который обрабатывает соединение.

0

Вы по-прежнему пытаетесь обрабатывать клиентов в своей основной теме. Основной поток должен просто принимать новые подключения и запускать новые потоки. Вы также должны сделать accept в петле, чтобы можно было принять несколько соединений:

ss = new ServerSocket(port); 
while(true) { 
    Socket socket = ss.accept();        
    Thread clientThread = new Thread(new Runnable() { 
     public void run() { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); 

      String msg = null; 

      while ((msg = reader.readLine()) != null) { 
       print("System out: " + msg);  

       if(msg.equals("Bye")) { 
        print("Client left"); 
        break; 
       } 
      } 

      socket.close(); 
      reader.close(); 
      writer.close(); 
     }}); 
    clientThread.start(); 
} 
+0

Есть ли способ избежать подхода анонимного класса? Это заставляет меня сделать final и serverSocket окончательными. – States

+0

Нет ничего плохого в конечных переменных. Фактически они делают ошибки инициализации менее вероятными. Вы можете преобразовать этот анонимный класс в именованный класс с полем «socket», чтобы избежать конечных переменных. –

Смежные вопросы