2009-08-20 177 views
2

我有一個Java應用程序,它有三個打開的​​線程,每個線程都是一個套接字並連接到不同端口上的服務器。 在建立與服務器的連接後,我在每個套接字上設置了so_timeout。 之後線程阻塞在read()上等待。 只有一個線程在20秒後超時(這是我設置的超時)。 另外兩個忽略超時。 TCP層可能一次只處理一個超時? 有沒有其他解釋?setSoTimeout在客戶端套接字上不會影響套接字

+0

請張貼您的代碼,您可能有一個鬼鬼祟祟的邏輯錯誤,不能被您的問題抓住。 – Jonathan 2009-08-20 13:25:20

+0

撥打sock.getSoTimeout()以確保它返回20000.也發佈一些代碼。你在運行什麼操作系統? – Nick 2009-08-20 20:36:51

+0

下面是建立連接的代碼: while(!connected){0} {0} {0} {0}請嘗試以下代碼:client = new Socket(); InetSocketAddress sa = new InetSocketAddress(serverIP,port); InetSocketAddress(serverIP,port); \t \t client.connect(sa); \t \t client.setKeepAlive(true); (UnknownHostException e){ \t} catch(UnknownHostException e){ \t \t e.printStackTrace(); \t \t return null; \t}趕上(IOException異常E){ \t ... \t} \t如果(client.isConnected()){ \t \t //設置超時阻止讀取操作。 \t \t try { \t \t \t client.setSoTimeout(timeout * 1000); (SocketException e) \t \t connected = true; \t} } – arsenalfan 2009-08-25 05:07:54

回答

2

documentation說:

的選項必須在進入阻塞操作有效果啓用。

也許你應該把它之前至少調用read()套接字之前建立到服務器的連接,
但很難說沒有代碼...

3

我在過去在處理SO_TIMEOUT在Windows中有幾個問題。我相信設置這是「假設」來設置底層的套接字實現,這可能取決於操作系統並與註冊表設置等相沖突。

我的建議是不使用SO_TIMEOUT在超時時強制引發異常。在讀取()之前,請使用非阻塞I/O或檢查是否有可用字節()。