2010-05-08 4 views
1

자바로 작성된 채팅 응용 프로그램을 만들고 싶습니다.TCP 포트의 양면 통신용 스레딩 소켓 핸들러

한 대의 컴퓨터가 서버를 호스트하고 다른 컴퓨터가 소켓 [TCP 포트]를 시작합니다.

내가 읽은 바로는 코드가 멈추는 것을 의미하는 소켓을 지속적으로 읽는 루프가 있어야합니다.

마우스가 눌렀을 때 'actionperformed'버튼이 있는데, 내가 쓴 정보를 보내기 위해 끊임없이 소켓을 읽는 루프와 함께 작동하는지 알고 싶습니다.

스레드를 사용해야하는 경우 run() 메서드가 무효화되어야하는지 여부를 알고 싶습니다. 스레드를 사용하면 스레드가 새 클래스를 만들고 전체 GUI가 텍스트 영역을 포함하는 하나의 큰 클래스이므로 스레드를 사용해야합니다. 은밀한.

또한 텍스트 영역에 직접 소켓에서 정보를 추출 할 수 있습니까 (텍스트 영역 변수가 "chatOutput"이라고할까요)?

당신은 채팅 메시지를 입력하기위한 텍스트 영역과 GUI를 가지고 있고, 대화방에 새 메시지를 전송하는 버튼 :

답변

1

나는이 상황임을 가정한다. Socket의 InputStream을 루핑하여 채팅 패널의 스트림으로 일부 패널을 업데이트하고 싶지만 InputStream이 반복되는 동안 Socket의 OutputStream에 쓸 수 있어야합니다. 이것은 클라이언트 측 코드에 대한 나의 제안 것

:

Socket con = new Socket(host, port); 
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
PrintWriter out = new PrintWriter(con.getOutputStream(), true); 
... 
Thread t = new Thread(new Runnable() { 
    public void run() { 
     while(con.isConnected()) { 
      String line = in.readLine(); 
      // update your chat panel with line 
     } 
    } 
}); 
t.start(); 
... 

그리고 당신의 행동

는 :

... 
out.println(/*contents of the text box*/); 
// clear contents of text box 
// ?update panel? 
... 
+0

채팅 패널 업데이트가 수행 될 때 정의되지 않은 동작을 방지하기 위해 gui 스레드에서 수행해야합니다. – luke

+0

+1 @luke : 좋은 지적입니다. 편리하게,이 예제에서 볼 수 있듯이'JTextArea'의'append() 메소드는 쓰레드에 안전하다. http://groups.google.com/group/comp.lang.java.help/msg/9f7f86db103f35c9 – trashgod

+0

오, 'u runnable'을 쓰레드 생성에서 쓸 수 있다는 것을 알기 때문에 새로운 클래스를 만들고 runnable을 구현해야한다고 생각했습니다. thx allot :)! – raven

0

귀하의 질문은,하지만 난 처음에 대답을 아마 조금 막연한 생각한다 질문은 그렇지 않습니다. 무한한 시간 동안 정상적인 작동을 방해하고 이벤트 발송 스레드가 리스너를 처리하지 못하게됩니다. (나는 이것에 대해 100 % 확실하지 않지만 더 오랫동안 알아 내고자 노력하고있다).

두 번째 대답은 예입니다. Finbarr에서 제안하는대로 응용 프로그램을 스레드해야합니다.

... 나는 그것이 새로운 클래스를 만드는 의미합니다 그것을 스레드, 전체 : 당신이 여기에 의미가 무엇 Runnable interface

아주 확실하지에 의해 지정된대로 실행 방법은, 예, 무효 GUI는 텍스트 영역을 포함하는 하나의 큰 클래스이며 비공개입니다. ...

하나의 클래스로 유지 하시겠습니까? 하나의 .java 파일을 유지하려면 클래스 내에 개인 클래스를 정의 할 수 있습니까? 몇 가지 이유. 방금 소켓 읽고 스레드 내부에 이런 전화와 같은 것을 사용 할 수 있습니다 GUI와 통신을

:

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
    chatoutput.setText("output text text"); 
    } 
}); 

당신은 Runnable 인터페이스를 구현하는 클래스를 작성해야합니다, 그리고 생성자에서 'chatoutput'변수를 전달하여 위의 작은 코드를 호출하는 데 사용할 수 있습니다.

더 복잡한 GUI 상호 작용이 필요한 경우 여기에서이 아이디어를 참조하십시오. GUI/application communication