2013-12-21 31 views
0

我正在使用java 7 AsynchronousSocketChannel編寫簡單的客戶端服務器應用程序。 一旦連接後,我開始它初始化的I/O 流與服務器上的一個線程:Java 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"); 

客戶端使用相同的代碼在其端部。

我遇到的問題是,如果同時初始化輸入流,然後輸出流,雙方都掛起。其他3種組合中的任何一種都可以正常工作,也就是說, 都會首先初始化輸出流,或者一個是輸入,另一個是先輸出。

任何人有任何想法,爲什麼這可能是?

客戶端獲得一個連接:與服務器監聽

InetSocketAddress addr = new InetSocketAddress(host, port); 
    AsynchronousSocketChannel channel = AsynchronousSocketChannel.open(); 
    Future<Void> future = channel.connect(addr); 
    future.get(); // blocks till connection is established 

​​

感謝任何洞察這一點。

回答

2

初始化時,ObjectOutputStream/ObjectInputStream對交換隱藏的服務消息。交換後初始化完成。這意味着,當一方打開ObjectOutputStream時,另一方必須打開ObjectInputStream,反之亦然。

順便說一句,如果你使用每個連接的線程,使用AsynchronousSocketChannel和mot plain socket有什麼意義?

+0

那麼,當雙方首先打開輸出流時它是如何工作的? – user3125878

+0

另外,當我使用舊式套接字時,我根本沒有看到問題。你是對的,我不需要使用異步,如果我使用每個連接線程(除了也許新的類優化更好);我只是做一些實驗來看看這些類如何協同工作。 – user3125878

+0

ObjectInputStream的API文檔進一步闡明瞭這個問題:_「這個構造函數將阻塞,直到相應的ObjectOutputStream已經寫入並刷新了頭文件。」_這就解釋了爲什麼初始化** ObjectOutputStream **首先在兩邊都不是** **一個問題,但首先在兩邊初始化** ObjectInputStream ** **是一個問題。 – user3125878