소켓 프로그램 중에 에러는 나지 않는데 서버에서 패킷을 받질 못하고 있습니다.
그래서 왜그럴까..하며 break point를 찍어가며 확인 해보니
소켓을 호출해서 커넥트 하는 부분에서 NullPointerException이 일어나고 있더군요.
return csocket.ServerConnect(ia, port); <- 여기.
ServerConnect()메소드에 서버를 접속하는 구문이 명시되어있지만, 들어가기도 전에 이미 exception이 일어나더군요.
그래서 왜그럴까..왜그럴까.. 하고 머리아파하며 또 break point 찍어가면서 확인 해보니
애초에 소켓을 선언하는 부분부터 csocket이 null값을 가지고 있더군요.
춈 황당했습니다.
소켓은
private ClientSocket csocket = null;
이라는 구문으로 선언되며,
같은 패키지에 묶여 있는 ClientSocket.java에 생성자가 명시되어 있습니다.
근데 이클립스 이놈이 "source not found"라면서 클래스를 찾아내질 못하네요..
어찌된 일일까요..ㅠㅠ
아무리 검색해봐도 이런 현상에 대한 해결책은 커녕 언급도 안되어 있더군요;;
도대체 무슨 일이 일어나고 있는지 아시는 고수분 계신가요ㅠㅠ
맨 위쪽에 private ClientSocket csocket = null;로 먼저 선언해 주고(이 부분은 breakpoint가 안먹더군요; 실제로 생성하는 곳이 아니라서 그런가봅니다;) onCreate안에서 csocket = new ClientSocket();으로 최초 생성해주고 있습니다. 그런데 이 부분에서 선언과 동시에 PathClassLoader가 실행되고, ClassNotFoundException이 발생하네요.. 아마 저 로더가 ClientSocket.java에서 ClientSocket class를 못 찾는 걸까요.. 도대체가 이유를 모르겠네요..ㅠ
해결했습니다! 한숨자고 일어나서 봤더니 보이더군요..
문제는 onCreate에 생성자가 있었던거 였던 것 같습니다. (확실하지는 않습니다;)
제가 서비스에서 자동으로 소켓 커넥팅을 하고 싶어서 서비스 클래스의 onCreate에 생성자를 선언했었는데,
그렇게 하니까 메인 액티비티에서 서비스 클래스를 다시 부르니 onCreate에서 생성했던 것은 무시해버리고
다시 null값으로 돌아가는 것 같더군요.
그래서 onCreate에서 선언을 미리 하지 않고, 메인 액티비티에서 커넥트를 시도 할 때 마다 매번 선언하게 만들어 주니까
다시 null 값으로 돌아가지 않았습니다;; 단지 생성자 선언 위치만 바꿔주면 되는 거였는데 이걸 가지고 한나절을 버렸네요ㅠㅠ
조언해 주신 고수분들 감사합니다!