2011-02-26 2 views
0

이것은 수업 과제이므로 답변 이외의 힌트가 필요합니다.SocketChannel 연결에서 Java 문제가 발생했습니다.

4 개의 가상 리눅스 머신에서 실행중인 프로세스가 있습니다. 각 프로세스는 두 개의 이웃과 통신합니다. 각 프로세스가 사용합니다

server = ServerSocketChannel.open() 
server.configureBlocking(false) 
server.socket().bind(new InetSocketAddress(port)) 
server.register(selector, SelectionKey.OP_ACCEPT) 

프로세스 A는 다른 사람과 연결을 시도하지 않습니다. 프로세스 B가 수행한다.

SocketChannel SC = SocketChannel.open() 
SC.configureBlocking(false) 
SC.connect(new INetSocketAddress(A-machine, A-port) 
SC.register(selector, SC.validOps()) 

프로세스 C는 B와 동일하게 수행된다. D를 C와 함께 사용합니다.

다음으로 selector.select를 호출하고 선택된 keys를 반복합니다. 내가 key.isValid() & & key.isAcceptable()가 true를 모두 볼 때, 나는 소켓이 나에게 연결을 시도하는 생각 나는() & & 키를 key.isValid을 볼 때 나는

SocketChannel client = server.accept() 
client.configureBlocking(false) 
client.register(selector, client.validOps()) 

를 호출합니다. isConnectable() 두 가지 모두 사실, 내가 연결할 서버를 사용할 수 있다고 생각합니다. 나는 key.isValid를 볼 때() & & key.isReadable(), 내가받은 메시지를 읽을

SocketChannel connectingChannel = (SocketChannel)key.channel() 
connectingChannel.finishConnect() 

를 호출합니다.

이 프로세스는 순서대로 진행됩니다. A, B, C, D. B 만 시작하면 finishConnect 문에서 실패합니다.

isConnectable은이 키의 채널이 소켓 연결 작업을 완료했는지 또는 완료하지 못했는지 여부를 테스트합니다. isConnectable이 true이고 finishConnect에서 오류가 발생하는 이유는 무엇입니까?

답변

0

우리는 finishConnect 주위에 try/catch를 포장했습니다. 캐치 내부에서, 우리는 다음 (원래 문제 설명에 두 번째 조각)에 연결을 시도했던 방법이라는 현재의 SelectionKey에 취소 전화 : 우리는이 작업을 수행 할 것이라고 예상하고

SocketChannel SC = SocketChannel.open() 
SC.configureBlocking(false) 
SC.connect(new INetSocketAddress(A-machine, A-port) 
SC.register(selector, SC.validOps()) 

을, 우리는 추가 SC와 A-machine 및 A-port 사이의 관계를 저장하는 코드이므로 재 시도를 할 때이 코드를 사용하게됩니다. 따라서 catch 이전에 취소하기 전에 실패한 SocketChannel을 사용하여 필요한 A-machine 및 A-port 데이터를 검색했습니다.

결국 서버가 시작되었고이 연결이 성공적으로 완료되었습니다.

나는 이것이 대답이 아니라 힌트라는 것을 알고있다. 그러나 그것은 우리의 과제이다.