2012-02-23 6 views
0
Socket Client = new Socket("ip", port); 
private ObjectOutputStream out; 
out = new ObjectOutputStream(Client.getOutputStream());//line3 
out.flush(); 

У меня есть программа сокетов. Когда у меня есть клиент, нет проблем. Но когда клиент больше, чем один во втором и более позднем клиентах, то программа waiting на линии 3.it не имеет никаких ошибок и исключений. проблема?ObjectOutputStream требует ответа от сервера?

 TCP = new Thread(new Runnable() { 

      @Override 
      public void run() { 
      if ("TCP".equals(Protocol)) { 
      try { 
       Thread.sleep(10); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } 

      RunServer(); 

     } 
      } 
     }); 
     TCPWait = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        WaitForConnection(); 
       } catch (IOException ex) { 
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
     TCPWait.start(); 
     TCP.start(); 
    public void RunServer() { 
     try { 

      while (true) { 
       { 
        accessLock.lock(); 
        if(CanContinue == false) 
         condition.await(); 
        try { 
//      WaitForConnection(); 
         GetStreams(); 
         ProcessConnection(); 
        accessLock.unlock(); 

        } catch (Exception e) { 
         JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage()); 


        } 
       } 
      } 

     } catch (Exception e) { 
      JOptionPane.showMessageDialog(rootPane, e.getMessage()); 
     } 
    public void WaitForConnection() throws IOException { 
     jTextArea1.append("لطفا تا برقرای ارتباط صبر کنید.../n "); 
     accessLock.lock(); 
     connection = server.accept(); 
     CanContinue = true; 
     condition.signal(); 
     accessLock.unlock(); 

     jTextArea1.append("ارتباط از " + connection.getInetAddress().getHostName() + "\n"); 

    } 

    public void GetStreams() { 
     try { 
      Socket s = new Socket(); 
      s = connection; 
      out = new ObjectOutputStream(s.getOutputStream()); 
      out.flush(); 

      in = new ObjectInputStream(s.getInputStream()); 
      jTextArea1.append("در حال برقرای ارتباط...\n"); 
     } catch (Exception e) { 
      JOptionPane.showMessageDialog(rootPane, "مشکل در برقرای ارتباط!\n"); 

     } 

    } 

    public void ProcessConnection() { 
     SendData("ارتباط برقرا شد\n"); 
     try { 
      jTextArea1.append((String) in.readObject() + "\n"); 

     } catch (Exception e) { 
     } 
     String message = ""; 

     do { 
      try { 

       jTextArea1.append((String) in.readObject() + "\n"); 
      } catch (Exception e) { 
      } 
     } while (message != "Exit"); 


    } 

WaitForConnection() является слушателем, который в потоке и runserver() отправлять и получать сообщения, которые в другом потоке.

+0

Клиенты - это разные процессы Java? – Tudor

+0

yes client - это программа и сервер другой. –

+0

И вы запускаете несколько клиентских программ, когда эта проблема возникает? – Tudor

ответ

0

Насколько я могу видеть, вы ждете только для соединения один раз в этой теме:

TCPWait = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       WaitForConnection(); 
      } catch (IOException ex) { 
       Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    }); 

вместо ожидания нескольких соединений в главном цикле:

 while (true) { 
      { 
       accessLock.lock(); 
       if(CanContinue == false) 
        condition.await(); 
       try { 
     //   WaitForConnection(); 
        GetStreams(); 
        ProcessConnection(); 
       accessLock.unlock(); 

       } catch (Exception e) { 
        JOptionPane.showMessageDialog(rootPane, "ارتباط قطع شد" + e.getMessage()); 


       } 
      } 
     } 

Так один клиент подключается, а затем остальные застревают, потому что вы больше никогда не вызываете прием. Вы должны расторгнуть этот звонок, чтобы позвонить по телефону WaitForConnection();

+0

Я написал это, но не правильно. В процессеConecton() у нас есть цикл, который видит, что –

+0

Этот цикл только добавляет некоторый текст. Проблема в том, что вы вызываете только один раз, поэтому только один клиент может подключиться. Поместите счетчик в свой метод 'WaitForConnection' и посмотрите, сколько раз он выполняется. – Tudor

+0

Да, ваше право, прием выполняется один раз.i вставьте его (true), но он выполняется один раз! –

1
Socket s = new Socket(); 
s = connection; 

Что-то в этом плохого не происходит.

+1

Это не проблема. Он просто выделяет этот сокет без причины, а затем назначает ему сокет, полученный из 'accept'. Реальная проблема заключается в том, что он только однажды «принимает». – Tudor

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