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

나는 소켓 program.when 나는 문제가 없다 클라이언트가있다. 클라이언트가 둘째로이고 나중에 클라이언트 프로그램은이다 ​​waiting 선 3.it에는 아무 과실도없고 exception.what는있다 문제? 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

클라이언트가 다른 자바 프로세스입니까? – Tudor

+0

예 클라이언트는 프로그램이고 다른 하나는 서버입니다. –

+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

나는 그것을 썼다. 그러나 정확하지 않다. processConecton() 우리는 루프를 가지고있다. –

+0

그 루프는 약간의 텍스트만을 덧붙인다. 문제는 오직 한 번만 accept를 호출하므로 하나의 클라이언트 만 연결할 수 있다는 것입니다. WaitForConnection 메소드에 카운터를 추가하고 실행 횟수를 확인하십시오. – Tudor

+0

예 귀하의 권리는 수락 once.i 동안 넣어 (사실)하지만 한 번 실행! –

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

심각한 문제가 있습니다.

+1

정말 문제가 아닙니다. 그는 아무 이유없이 그 소켓을 할당 한 다음'accept'에서 얻은 소켓을 할당합니다. 진짜 문제는 그가'accept '를 한 번만 호출한다는 것입니다. – Tudor