이것은 수업 과제이므로 답변 이외의 힌트가 필요합니다.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에서 오류가 발생하는 이유는 무엇입니까?