我正在使用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 ...
}
感谢您对此的任何见解。
最佳答案
初始化时,ObjectOutputStream / ObjectInputStream对交换隐藏的服务消息。交换后初始化完成。这意味着,当一侧打开ObjectOutputStream时,另一侧必须打开ObjectInputStream,反之亦然。
顺便说一句,如果您每个连接使用一个线程,那么使用AsynchronousSocketChannel和mot plain socket有什么意义?