나는 자바 7 AsynchronousSocketChannel을 사용하여 간단한 클라이언트 서버 응용 프로그램을 작성하고 있습니다.자바 7 AsynchronousSocketChannel
ObjectInputStream is;
ObjectOutputStream os;
is = new ObjectInputStream(Channels.newInputStream(client));
System.out.println("Got is");
os = new ObjectOutputStream(Channels.newOutputStream(client));
System.out.println("Got os");
클라이언트는 끝에서 동일한 코드를 사용하여 연결이 이루어지면 , 나는와 I/O를 스트림을 초기화하는 서버에 스레드를 시작합니다.
내가 겪고있는 문제는 둘 다 입력 스트림을 먼저 초기화 한 다음 출력 스트림을 초기화하면 양쪽이 중단된다는 것입니다. 다른 세 가지 조합 중 아무 것도 작동합니다. 즉, 은 출력 스트림을 먼저 초기화하거나 입력 스트림을 먼저 초기화하고 다른 하나는 먼저 출력을 초기화합니다.
아무도 이유가 무엇입니까? 와 서버가 수신
InetSocketAddress addr = new InetSocketAddress(host, port);
AsynchronousSocketChannel channel = AsynchronousSocketChannel.open();
Future<Void> future = channel.connect(addr);
future.get(); // blocks till connection is established
:이 어떤 통찰력에 대한
InetSocketAddress addr = new InetSocketAddress(port);
AsynchronousServerSocketChannel server
= AsynchronousServerSocketChannel.open().bind(addr);
Future<AsynchronousSocketChannel> future = server.accept();
client = future.get(5, TimeUnit.SECONDS);
if (client != null) {
// open streams as shown above ...
}
감사
클라이언트와의 연결을 가져옵니다.
그러면 양측이 먼저 출력 스트림을 열 때 어떻게 작동할까요? – user3125878
또한 구식 소켓을 사용할 때 전혀 문제가 보이지 않습니다. 맞습니다. 연결 당 스레드를 사용하고 있다면 비동기를 사용할 필요가 없습니다 (새로운 클래스가 더 잘 최적화 된 경우 제외). 나는이 수업들이 어떻게 함께 작동하는지보기 위해 약간의 실험을하고있다. – user3125878
ObjectInputStream의 API 문서가이 문제에 관해 더 자세히 설명합니다. _ "이 생성자는 해당 ObjectOutputStream이 헤더를 작성하고 플러시 할 때까지 차단됩니다."_ 이렇게하면 처음에 ** ObjectOutputStream **을 양쪽에서 초기화하는 것이 ** 그렇지 않은 이유가 설명됩니다. ** 문제는 있지만 ** ObjectInputStream ** 초기화는 처음에는 양쪽 모두에서 ** 문제가됩니다. – user3125878