2016-02-11 5 views
2

Я создал простой сервер MultiThreaded. Everytime он принимает клиенту что DataInputStream и DataOutputStream создается и запускается ComunicationМногопоточный сервер получает данные только от одного клиента JAVA

Сервер:

public class Connection implements Runnable{ 
boolean isAlreadyOpened = false; 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try {   
     ServerSocket ss = new ServerSocket(7000); 
     while(true){ 
      System.out.println("Il Server sta cercando Connessioni"); 
      Socket s = ss.accept(); 
      System.out.println("Il Server ha accettato un Client"); 

      Thread t2 = new Thread(new Runnable(){ 
       public void run(){    
        try { 

         DataInputStream dis = new DataInputStream(s.getInputStream()); 
         isAlreadyOpened = true; 
         DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
         while(true){ 
          String test = dis.readUTF(); 
          dos.writeUTF(test); 
          System.out.println(test); 
          dos.flush(); 
         }      
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         isAlreadyOpened = false; 
        } 
       }   
      }); 
      t2.start(); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
} 

Я пробовал подключить Android-приложение и JavaApp; каждые 40 секунд обе эти программы отправляют строку через writeUTF. Соединение установлено правильно с обоих Клиентов, но сервер получает данные только от последнего, который подключается к серверу. Как я могу позволить серверу получать/отправлять данные от/до ВСЕХ клиентов?

EDIT:

Я пробовал установить это:

public class Connection implements Runnable { 

@Override 
    public void run() { 

    try { 
     ServerSocket ss = new ServerSocket(7000); 
     while (true) { 
      System.out.println("Server is listening"); 
      Socket s = ss.accept(); 
      System.out.println("Client Accepted"); 

      Thread t2 = new Thread(new Runnable() { 
       public void run() { 
        try { 
         DataInputStream dis = new DataInputStream(s.getInputStream()); 
         DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
         while (true) { 
          String test = dis.readUTF(); 
          dos.writeUTF(test); 
          System.out.println(test); 
          dos.flush(); 
         } 
        } catch (IOException 
         e.printStackTrace(); 
        } finally { 
         try { 
          s.close(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      });     
    t2.start(); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Но результат тот же

EDIT:

Andorid Client Code

public class Connection implements Runnable { 
@Override 
public void run() { 
    try { 
     Socket s = new Socket("127.0.0.1", 7000); 
     DataInputStream dis = new DataInputStream(s.getInputStream()); 
     DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 

     while(true){ 
      dos.writeUTF("FromAndroid"); 
      Log.d("InputStreammmm", dis.readUTF()); 
     Thread.sleep(10000) 
     } 

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

} 

JAVA APP КЛИЕНТ КОД

@Override 
public void run() { 
    try { 

     Socket socket = new Socket("127.0.0.1", 7000); 
     System.out.println("Connessooo"); 
     DataInputStream dis = new DataInputStream(socket.getInputStream()); 
     DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

     while(true){ 
     dos.writeUTF("Invioooooooooooooooooooooooooo"); 
     result = dis.readUTF(); 
     System.out.println(result); 
     Thread.sleep(10000); 
     } 

    } catch (IOException e) { 

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

     e.printStackTrace(); 
    } 
} 

РЕДАКТИРОВАТЬ С СПИСОК SOCKET:

public class Connection implements Runnable { 
List<Socket> sList = new ArrayList<>(); 
Socket s; 
int i = 0; 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try { 
     ServerSocket ss = new ServerSocket(7000); 
     while (true) { 
      System.out.println("Server Listening"); 
      s = ss.accept(); 
      sList.add(s); 

      System.out.println("Accepted Client --- " +s.toString()); 
      Thread t2 = new Thread(new Runnable() { 
       public void run() { 
        try { 
         DataInputStream dis = new DataInputStream(s.getInputStream()); 

         while (true) 
         { 
          String test = dis.readUTF(); 
          System.out.println("Message sent from -- " + sList.get(i).toString()); 
          System.out.println(test); 

          while(i < sList.size()){ 
           DataOutputStream dos = new DataOutputStream(sList.get(i).getOutputStream()); 
           dos.writeUTF(test);  
           System.out.println("Message Sent to -- " + sList.get(i).toString()); 
           dos.flush(); 
           ++i; 
          } 
          i=0; 
         } 
        } catch (IOException e) 
        { 
         e.printStackTrace(); 
        } finally 
        { 
         try 
         {      
          System.out.println("Closing Socket --- " + sList.get(i).toString()); 
          sList.get(i).close(); 
          sList.remove(i); 

         } 
         catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 
      t2.start(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

Делая таким образом, моя проблема решена, как было предложено EJP ...

+1

Вы никогда закрытие принятого сокета. Но в противном случае этот код должен работать. Вы уверены, что проблема не в конце клиента? Но как этот код компилируется, когда '' 'не является окончательным? – EJP

+0

Что делать, если 3 клиента подключаются быстро, но не сразу отправляют данные на сервер. Эти переменные все выходят за рамки. Конечно, этот код не в порядке. –

+1

@ peter.petrov Код будет блокироваться в 'readUTF()' до тех пор, пока не будут получены данные или не произойдет исключение. Здесь ничего плохого. – EJP

ответ

1

Не удается воспроизвести.

программа испытаний, копировать-вставить из отредактированной коды и добавила final к Socket s, как я использую Java 7, и добавила код клиента:

public class Connection implements Runnable 
{ 

    @Override 
    public void run() 
    { 

     try 
     { 
      ServerSocket ss = new ServerSocket(7000); 
      while (true) 
      { 
       System.out.println("Server is listening"); 
       final Socket s = ss.accept(); 
       System.out.println("Client Accepted"); 

       Thread t2 = new Thread(new Runnable() 
       { 
        public void run() 
        { 
         try 
         { 
          DataInputStream dis = new DataInputStream(s.getInputStream()); 
          DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
          while (true) 
          { 
           String test = dis.readUTF(); 
           dos.writeUTF(test); 
           System.out.println(test); 
           dos.flush(); 
          } 
         } 
         catch (IOException e) 
         { 
          e.printStackTrace(); 
         } 
         finally 
         { 
          try 
          { 
           s.close(); 
          } 
          catch (IOException e) 
          { 
           e.printStackTrace(); 
          } 
         } 
        } 
       }); 
       t2.start(); 
      } 
     } 
     catch (IOException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    public static void main(String[] args) throws InterruptedException 
    { 
     Connection c = new Connection(); 
     Thread t1 = new Thread(c); 
     t1.setDaemon(true); 
     t1.start(); 
     Runnable r = new Runnable() 
     { 
      public void run() 
      { 
       try (Socket s = new Socket("localhost", 7000)) 
       { 
        DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
        DataInputStream dis = new DataInputStream(s.getInputStream()); 
        for (int i = 0; i < 10; i++) 
        { 
         dos.writeUTF("Hello from "+Thread.currentThread().getName()); 
         String reply = dis.readUTF(); 
         Thread.sleep(10*1000); 
        } 
       } 
       catch (IOException|InterruptedException exc) 
       { 
        exc.printStackTrace(); 
       } 
      } 
     }; 
     Thread t2 = new Thread(r); 
     Thread t3 = new Thread(r); 
     t2.start(); 
     t3.start(); 
     t2.join(); 
     t3.join(); 
    } 
} 

Выход:

Server is listening 
Client Accepted 
Server is listening 
Client Accepted 
Server is listening 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-2 
Hello from Thread-1 
Hello from Thread-2 
Hello from Thread-1 
+0

Мой код тот же .. но он не работает. Может ли быть проблемой java8? Или это может быть связано с различием между моими клиентами (один JavaApp и один Android)? –

+1

Опубликуйте своих клиентов, и я скажу вам. – EJP

+0

Хорошо, я понял это. Моя служба теперь может слушать от обоих клиентов .. Таким образом, сервер отображает все сообщения. Но клиенты не получают сообщение, отправленное другим. Я отправляю код клиента. –

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