항목에서와 비슷합니다 - 시스템 출력 및 오류 스트림은 Kernel 클래스의 "update"메소드의 catch 절에서 "고정"된 것처럼 보입니다. 이상하게도 내가 프로젝트를 디버깅하고 System.out 라인에서 멈출 때 나는 돌파구를 제거 할 수 있고 모든 것이 올바르게 작동한다.소켓 catch 절의 시스템 출력/오류 스트림은 디버그 모드에서만 작동합니다.
마지막 System.out을 제외한 모든 항목이 실행되며, 기본 System.out을 교체 할 때에도 작동하지 않습니다.
현재 연결이 완료된 직후에 사용자의 연결을 끊습니다.
내 코드, StartServer.java :
public class StartServer { public static void main (String[] args) { Kernel kernel = new Kernel(4444); kernel.run(); while (true) { kernel.update(); } } }
Kernel.java :
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Kernel {
ArrayList<Socket> clients;
ServerSocket socket;
public Kernel(int port) {
try {
socket = new ServerSocket(port);
clients = new ArrayList<>();
System.out.println("Server initialized");
} catch (IOException ex) {
Logger.getLogger(StartServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void run() {
Thread thread = new Thread(){
public void run() {
try {
while (true) {
Socket client = socket.accept();
clients.add(client);
System.out.println("New user on the server!");
}
} catch (IOException ex) {
Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
thread.start();
}
public void update() {
for (int i=0; i<clients.size(); i++) {
Socket s = clients.get(i);
try {
/*String result;
if (s.getInputStream().available()!=0) {
byte[] byteRes = new byte[s.getInputStream().available()];
char[] charRes = new char[s.getInputStream().available()];
s.getInputStream().read(byteRes);
for (int i2=0; i2<charRes.length; i2++) {
charRes[i2] = (char) byteRes[i2];
}
result = String.copyValueOf(charRes);
System.out.println(result);
}*/
throw new IOException();
} catch (IOException ex) {
try {
System.out.println("Client disconnected"); //working only in debug mode
clients.remove(s);
s.close();
i--;
} catch (IOException ex1) {
Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
}
}
* 어떤 * IOException에 '클라이언트 연결이 끊어졌습니다'? 예외 자체에서 메시지를 인쇄해야합니다. 이런 중요한 정보를 놓치지 마십시오. 그리고 '브레이크 포인트'를 의미합니까? – EJP