2010-04-20 7 views
2

내가 소켓 프로그래밍 및 타이머를 사용하여 클라이언트의 입력 스트림을 수신하는 프로그램을 만들려고 노력하고있어자바 타이머와 소켓 문제

하지만 타이머가 실행 할 때마다 .. 는

이 제발 도와주세요 교수형됩니다 여기

코드 ... 사전

에서

private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { 
    // TODO add your handling code here: 
    try 

    { 
     ServerUserName=jTextField1.getText(); 
     ss=new ServerSocket(5000); 
     jButton1.enable(false); 
     jTextArea1.enable(true); 
     jTextField2.enable(true); 
     Timer t=new Timer(2000, new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       try 
       { 
        s=ss.accept();      
        InputStream is=s.getInputStream(); 
        DataInputStream dis=new DataInputStream(is); 
        jTextArea1.append(dis.readUTF()); 

       } 
       catch(IOException IOE) 
       { 
       } 
       catch(Exception ex) 
       { 
        setLbl(ex.getMessage()); 
       } 

      } 
     }); 
     t.start(); 
    } 
    catch(IOException IOE) 
    { 

    } 
} 

덕분 체크 아웃

답변

4

프로그램을 멀티 스레드로 설정하십시오. 한 스레드가 소켓에서 청취하고, 다른 스레드는 GUI를 처리합니다. SwingUtilities.invokeLater를 사용하여 네트워크 스레드가 데이터를 수신 할 때마다 GUI 스레드 ("이벤트 전달 스레드")가 GUI 업데이트를 수행하게하십시오. 난 당신이 소켓을 사용하려는 생각

1

accept을 호출 할 때마다 새 클라이언트가 서버에 연결될 때까지 기다립니다. 연결은 연결이 설정 될 때까지 차단됩니다. 서버 연결을 유지 관리하는 단일 클라이언트가있는 것 같습니다.

한 용액 코드 타이머 부의

s=ss.accept();      
InputStream is=s.getInputStream(); 
DataInputStream dis=new DataInputStream(is); 

외부 당겨이다.

업데이트 : 읽을 수없는 데이터를 사용할 수있는 경우 그 readUTF 여전히 차단하는 것입니다하지만 알고 있어야합니다.

0

대신 타이머의 타임 아웃 :

Thread listener = new Thread() { 
    ServerSocket ss; 

    @Override 
    public void run() { 
     try { 
      ss = new ServerSocket(5000); 
      ss.setSoTimeout(2000); 
      try { 
       while (true) { 
        try { 
         final String text = acceptText(); 
         SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           jTextArea1.append(text); 
          } 
         }); 
        } catch (final Exception ex) { 
         SwingUtilities.invokeLater(new Runnable() { 
          public void run() { 
           setLbl(ex.getMessage()); 
          } 
         }); 
        } 
       } 
      } finally { 
       ss.close(); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private String acceptText() throws IOException { 
     Socket s = ss.accept(); 
     try { 
      InputStream is=s.getInputStream(); 
      try { 
       DataInputStream dis=new DataInputStream(is); 
       return dis.readUTF(); 
      } finally { 
       is.close(); 
      } 
     } finally { 
      s.close(); 
     } 
    } 
}; 
listener.setDaemon(true); 
listener.start();