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

私はソケットのプログラムを持っています。問題はありません。しかし、クライアントが2番目以降のクライアントであれば、プログラムは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

はいクライアントはプログラムであり、もう1つはサーバーです。 –

+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()); 


       } 
      } 
     } 

だから、1クライアントは接続し、残りの部分はスタックされません。その電話番号のコメントを外す必要がありますWaitForConnection();

+0

私はそれを書いたが、正しくありませんでした。processConecton()にループがあります。 –

+0

そのループは何らかのテキストを追加します。問題は、受け入れを1回だけ呼び出しているため、1人のクライアントしか接続できないということです。あなたの 'WaitForConnection'メソッドにカウンタを置き、実行された回数を確認してください。 – Tudor

+0

はいあなたの権利は受け入れられますonce.iはwhile(true)を入れますが、一度実行します! –

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

何かが重大に間違っています。

+1

それは本当に問題ではありません。彼は何の理由もなくそのソケットを割り当てているだけで、 'accept'から得たソケットを割り当てます。本当の問題は、彼が一度だけ「受け入れる」ということです。 – Tudor

関連する問題