public class ServerExample extends Application {
List<Client> connections = new Vector<Client>();
void startServer() {
serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel , Void>() {
@Override
public void completed(AsynchronousSocketChannel socketChannel, Void attachment) {
}
@Override
public void failed(Throwable exc, Void attachment) {
}
});
}
void stopServer() {
}
class Client {
AsynchronousSocketChannel socketChannel;
Client(AsynchronousSocketChannel socketChannel) {
this.socketChannel = socketChannel;
receive();
}
void receive() {
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
socketChannel.read(byteBuffer, byteBuffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
connections.remove(Client.this);
}
}
}
}
큰 그림만 코드 적어봤는데, 끝에 보면 Client.this 있잖아
이거 무슨 뜻인지 모르겠어
this가 무엇을 의미하는거야
new CompletionHandler<Integer, ByteBuffer>() 익명 객체를 말하는거야?
해당 메서드 호출한 객체..
근데 this가 먼지도 모르는데 소켓 프로그래밍을 한다고?
this는 피호출되는 대상 자체를 가리키는 예약어 - dc App
근데 this가 메소드냐 ? 중괄호가 없는디
해당 메서드를 호출한 객체? 저 콜백 메서드라서 명시적으로 호출한 객체가 없는데
아 잘못 봤네 미안.. 난 자바 잘 모르는데 딱 보니까 클래스 중첩될때 바깥쪽 객체 가리킬때 사용하는거 같네 위 코드에서는 Client
this 메서드 아닌거 같은데
그러면 Client.this를 Client로 써도 된다는거야? 해보니까 에러가 나는데
아니지 Client는 클래스고 Client.this는 객체고..
this 키워드가 특정 객체를 지칭하는 키워드잖아.. c++충이라 자세한건 모르겠지만 맞을거야 아마
1 그냥 this 라고 하면 리스너로 등록된 CompletionHandler 타입의 인스턴스를 가리키는게 되는데 저기서 원하는거는 inner 클래스인 Client 타입의 인스턴스, 그러니까 소켓접속한 클라이언트마다 하나씩 생성되는 인스턴스를 리스트에서 제거한다는 뜻.
2 클라이언트 연결되면 List<Client> connections; 안에 Client 타입의 인스턴스가 생성되어서 등록이 되고, 읽다가 삑사리나면 connections 에서 제거하겠다는 뜻. 근데 inner class 인 Client 안에 또 익명 리스너 구현체가 있다보니 요상한 코드가 되었음.
3. 임시미봉책은 Client 생성자 메소드안에서 호출되는 reset(); 을 reset(this)로 바꾸고 reset 메소드에 파라미터를 추가해서 void reset(final Client client){..} 로 바꿈. 그리고 익명리스너에서는 connections.remove( client); 로 수정함.
4. 주의할점은 생성자 안에서 소켓채널에 리스너 등록하는 짓을 하기때문에 인스턴스 생성 과정이 완벽히 끝난 후에 리스너로 등록하도록 프로그래머가 재주껏 보장해야 함. 원칙대로 하자면 소켓채널 인스턴스도 외부에서 생성자 호출시 넘겨주고있기때문에 리스너 등록 작업을 Clinet.reset()에서 하는게 아니라 Client 생성자를 호출하는 쪽에서 해줘야 함.
아놔콘다 감사감사 Client가 리스트에 있는 인스턴스들 타입을 말하는거였구나 reset()은 몰랐네
아놔콘다 말중에 이해가 잘 안가는부분도 있는데 몇 번 더 읽어봐야겠다
모두모두 고마워 디버그는 서툴러서 하나하나 코드 읽으면서 하고 있어