자바 질문도 괜찮죠? ^^*
글쓴이: 은빛연어 / 작성시간: 화, 2003/07/08 - 4:14오후
public void run() {
String data = "";
//System.out.println("0");
while(connect_flag) {
data = "";
try {
System.out.println("1");
data = dis.readUTF() + '\n';
System.out.println("2");
} catch(IOException e) {
memo.append("# read error");
}
memo.append(data);
}
}
위 코드처럼 //System.out.println("0");으로하면 "1"과 "2"가 안찍히네요...
근데 //를 빼면 "1"과 "2"가 찍혀요.. ㅡ,.ㅡ
당췌 자바를 모르는 지라서 어캐 손을 봐야되는지 모르겠네요... 조언좀 부탁해요 ^^;
Forums:


flush()
출력할 메시지를 출력한 후에 System.out.flush(); 를 넣어보세요.
전체 소스가 없으니 나머지는 모르겠네요.
SOrCErEr
예전에 인터넷에 돌아다니는 네트웍프로그래밍 소스중에서 자바좀 공부할려구
예전에 인터넷에 돌아다니는 네트웍프로그래밍 소스중에서 자바좀 공부할려구 하는데 잘 안되네염.. ^^ 전체 소스는 다음과 같습니다..
// 파일명: JavaChatClient.java // 기 능: 자바 소켓을 이용한 채팅 클라이언트 // 컴파일: javac JavaChatClient.java // 사용법: appletviewer JavaChatClient.html import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; //public class JavaChatClient extends Applet implements Runnable { public class chat extends Applet implements Runnable { final int PORT = 8080; Thread readMessage = null; // 수신 메시지를 읽는 스레드 선언 Socket s; DataInputStream dis; DataOutputStream dos; Button connect, disconnect; // 연결, 종료 버튼 TextArea memo; // 출력창 TextField name; // 참가자 이름 입력 창 TextField field; // 채팅 메시지 입력 창 boolean connect_flag = false; // 서버와의 연결 상태 플래그 // 애플릿의 init() 메소드 public void init() { // 이름 입력창, 연결 및 탈퇴 버튼 Panel p = new Panel(); Label label = new Label("My Name:"); name = new TextField("noname"); connect = new Button("Connect"); connect.addActionListener(new ConnectListener()); disconnect = new Button("Disconnect"); disconnect.addActionListener(new DisconnectListener()); p.add(label); p.add(name); p.add(connect); p.add(disconnect); // 메시지 입출력 창 memo = new TextArea(); memo.setEditable(false); field = new TextField(); field.addActionListener(new SendListener()); setLayout(new BorderLayout()); add(p, BorderLayout.NORTH); add(memo, BorderLayout.CENTER); add(field, BorderLayout.SOUTH); } // 연결(Connect) 버튼 처리 리스너 class ConnectListener implements ActionListener { public void actionPerformed(ActionEvent ae) { if(connect_flag == false) { try { s = new Socket(getCodeBase().getHost(), PORT); dis = new DataInputStream(new BufferedInputStream(s.getInputStream())); dos = new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); } catch(IOException e) { memo.append("# Can't open Socket\n"); return; } memo.append("# Connected successfully! \n"); // 통신을 담당할 스레드 생성 makeReadMessageThread(); readMessage.start(); // 자신의 초기 정보를 서버에 전송 try { dos.writeUTF(name.getText()+": has connected.."); dos.flush(); } catch(IOException e) { memo.append("# Connection error\n"); } connect_flag = true; } else { // 중복 연결 시도 처리 memo.append("# You are already connected\n"); } } } void makeReadMessageThread() { readMessage = new Thread(this); } // 스레드 실행 내용 (채팅 메시지를 읽어 화면에 출력) public void run() { String data = ""; //System.out.println("0"); while(connect_flag) { data = ""; try { System.out.println("1"); data = dis.readUTF() + '\n'; System.out.println("2"); } catch(IOException e) { memo.append("# read error"); } memo.append(data); } } // 채팅 메시지 송신 처리 리스너 class SendListener implements ActionListener { public void actionPerformed(ActionEvent ae) { String msg = "["+name.getText()+"] "+ field.getText(); try { dos.writeUTF(msg); dos.flush(); } catch(IOException e) { memo.append("# Sending error\n"); } field.setText(""); } } // 종료(Disconnect) 버튼 처리 리스너 class DisconnectListener implements ActionListener { public void actionPerformed(ActionEvent ae) { connect_flag = false; try { dos.writeUTF(name.getText()+": BYE..."); dos.flush(); } catch(IOException e) { } try { dos.close(); dis.close(); s.close(); } catch(IOException e) { } } } }중간쯤에 보면 "// 스레드 실행 내용 (채팅 메시지를 읽어 화면에 출력) "이부분이 잘안되네염...
컴파일해서 수행해보면 상태가 질문처럼 되구요.. ^^;
문제는 시간차였군요.. ^^;서버에 connection요청을 한
문제는 시간차였군요.. ^^;
서버에 connection요청을 한 후에, 수락되면 쓰레드 띄우고 이거저거 다 한 후에 connect_flag = true;를 하는데 이게 문제였군요..ㅋㅋ
시간차때문에 public void run() 에서 connect_flag가 false가 되어 있더군요.. ㅋㅋ
connection요청후에 바로 connect_flag = true;로 하니까 잘 되네염..
모두 감샤~
댓글 달기