2017-02-16 5 views
-3

Я новичок в программировании на Java и пытаюсь разработать многоклиентский чат-сервер.Java-чат-сервер с несколькими кликами

Ниже мой код:

package Server; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.ArrayList; 
import java.util.List; 

public class server implements Runnable{ 

    private List<ServerClient> clients = new ArrayList<ServerClient>(); 

//private String UID; 
private int port; 
private ServerSocket socket; 
private Thread run, manage, send, receive; 
private boolean running = false; 
public int i=0; 

    public server(int port){ 
//  this.UID = UID; 
     this.port = port; 
     try { 
      socket = new ServerSocket(port); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     run = new Thread(this, "Server"); 
     run.start(); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     running = true; 
     ManageClients(); 
     receive(); 
    } 
    private void ManageClients(){ 
     manage = new Thread("Manage"){ 
      public void run(){ 
       while(running){ 
        //managing 
       } 
      } 
     }; 
     manage.start(); 
    } 

    private void receive(){ 
     receive = new Thread("Receive"){ 
      public void run(){ 
       Socket S1 = null; 
       try { 
        S1 = socket.accept(); 
       } catch (IOException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       while(running){ 

/*     byte [] data = new byte[1024]; 
        DatagramPacket packet = new DatagramPacket(data, data.length); 
        try { 
         socket.receive(packet); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        String string = new String(packet.getData()); 
        System.out.println(string);*/ 
/*     BufferedReader br = null; 
        try { 
         br = new BufferedReader(new InputStreamReader(S1.getInputStream())); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        try { 
         String string = br.readLine(); 
         System.out.println(string); 
         process(string); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }*/ 
        process(S1); 
        System.out.println(String.valueOf(i)); 
        i++; 
       } 
      } 
     }; 
     receive.start(); 
    } 
    private void process(Socket S1){ 
     BufferedReader br = null; 
     String string = ""; 
     try { 
      br = new BufferedReader(new InputStreamReader(S1.getInputStream())); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      string = br.readLine(); 
      System.out.println(string); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     if(string.startsWith("/c/")){ 
      clients.add(new ServerClient("name", S1.getInetAddress(), S1.getPort(), "UID")); 
     } 
     else if(string.startsWith("/ip/")){ 
      //send ip address to raspberry 
      System.out.println(string); 
     } 
     else if(string.startsWith("/r/")){ 
      //send relay command to relay 
      System.out.println(string); 
     } 
    } 
} 

Сервер принимает только одно соединение. Если я попытаюсь подключить другого пользователя, консоль не будет показывать какой-либо вывод.

Не могли бы вы указать, куда я иду не так.

Спасибо

+0

Это очень широкий вопрос, в котором отсутствуют детали и детали. – tnw

ответ

0

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

В вашем коде кажется, что вы звоните только accept, и, следовательно, вы получите только одно клиентское соединение.

Я бы порекомендовал вам изменить архитектуру кода здесь, но если вы хотите сохранить ее в том же состоянии, и вы знаете, сколько клиентов подключится, тогда вы можете обернуть свой доступ к сокете в блокировке синхронизации и позвонить receive метод один раз для каждого клиента.

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