首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 7 AsynchronousSocketChannel

Java 7 AsynchronousSocketChannel
EN

Stack Overflow用户
提问于 2013-12-21 19:14:59
回答 1查看 599关注 0票数 0

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

代码语言:javascript
复制
    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" );

客户端使用相同的代码。

我遇到的问题是,如果先初始化输入流,然后初始化输出流,则双方都挂起。其他三个组合中的任何一个都可以工作,这意味着,要么先初始化输出流,要么一个先输入,另一个先输出。

有人知道为什么会这样吗?

客户端获得以下连接:

代码语言:javascript
复制
    InetSocketAddress addr = new InetSocketAddress( host, port );
    AsynchronousSocketChannel channel = AsynchronousSocketChannel.open();
    Future<Void> future = channel.connect( addr );
    future.get();  // blocks till connection is established

服务器侦听以下内容:

代码语言:javascript
复制
    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 ...
    }

谢谢你对此的洞察力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-21 19:42:42

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

顺便说一下,如果每个连接都使用一个线程,那么使用AsynchronousSocketChannel和mot普通套接字有什么意义呢?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20722584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档