Java 7 AsynchronousSocketChannel

时间:2013-12-21 19:14:59

标签: java asynchronous

我正在使用java 7 AsynchronousSocketChannel编写一个简单的客户端服务器应用程序。 建立连接后,我在服务器上启动一个初始化I / O的线程 溪流:

    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" );

客户端在其末端使用相同的代码。

我遇到的问题是如果首先初始化输入流然后再初始化输入流 输出流,双方都挂了。任何其他3种组合都可以,这意味着, 首先初始化输出流,或者先输入一个输入,另一个输出先输出。

任何人都知道为什么会这样?

客户端获取与:

的连接
    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 ...
    }

感谢您对此有任何了解。

1 个答案:

答案 0 :(得分:2)

初始化时,ObjectOutputStream / ObjectInputStream对交换隐藏的服务消息。交换后初始化完成。这意味着,当一方打开ObjectOutputStream时,另一方必须打开ObjectInputStream,反之亦然。

顺便说一句,如果你每个连接使用一个线程,使用AsynchronousSocketChannel和mot plain socket是什么意思?