57016


「SocketのInputStream、OutputStreamのタイムアウト値を個別に設定する方法」について、教えていただけないでしょうか。

サーバー側のソケットで、クライアントからの  
受信(InputStream)は無限に待ちつづけ、  
送信(OutputStream)のみタイムアウト値を設定することは可能でしょうか？  
Java1.4を利用して、以下のようにSocket接続をしているのですが、  
Socket#setSoTimeoutでタイムアウト値を指定すると、  
データの送受信がないときにソケットが閉じられてしまいます。  
入力処理は無限に待ち続け、出力処理のみタイムアウト値を設定することは可能でしょうか？

[code]

    ServerSocket serverSocket = new ServerSocket(0);
    Socket socket = serverSocket.accept();          // ブロッキングされる（クライアントからの通信開始要求が来るまで待機）
    socket.setSoTimeout(5 * 1000);              // タイムアウト値を５秒に設定
    
    InputStream inputStream = new BufferedInputStream(socket.getInputStream());
    OutputStream outputStream = new BufferedOutputStream(socket.getOutputStream());
    
[/code]

追伸：  
ウェブサーバーのように(HTTP1.1のKeep-Aliveように)、  
クライアントからの受信を待ちつつ、こちらから送信できない相手は切断するといった仕組みは、  
どのように実装するべきでしょうか？


CC BY-SA 4.0
2019-07-26T11:15:06.143
56916
2019-07-31T12:11:15.327
2019-07-26T13:53:22.593
13199
35267
question
java
SocketのInputStream、OutputStreamのタイムアウト値を個別に設定する方法


送信時エラーを検知して閉じたいのであれば、このようにすれば良いのではないでしょうか。

[code]

    try{
      outputStream.write(something);
    }catch(IOException e){
      closeSocket();
    }
    
    
[/code]

あるいは、相手側は一定時間おきに接続維持のための信号（HeartBeat的なもの）を送る、というプロトコルにしておいてsocketTimeoutの設定(setSoTimeout)によって、相手側がN/W的に死んだことを検知する、というのはいかがでしょうか。


CC BY-SA 4.0
2019-07-29T22:45:15.247
57016
2019-07-29T22:45:15.247
7572
56916
answer


返信ありがとうございます。  
私が携わっている環境は、組み込み機器のためJava1.4ベースです。  
ブラウザ（主にChrome）と通信するHTML5のWebSocketサーバーを設計したく、質問させていただきました。

私の携わっている環境で、タイムアウト値を設定しない場合、  
outputStream.write(something);は、  
初回の送受信が成功したあとにネットワークケーブルを抜いたとき、  
IOExceptionは発火されず未応答状態になるようです。

setKeepAlive()調べてみました、私には難しかったです。  
Java1.4で、TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT,
tcp_keepalive_timeなども設定できるかを調べてみます。  
（無通信時間がデフォルト２時間は、私の環境では長すぎます。<https://teratail.com/questions/108073>）  
可能だと分かった場合はsetKeepAliveを利用し、  
不可なら独自にタイムアウト監視処理（タイムアウトを検知したらshutdownOutputメソッドをコール）を用意せざるを得ないのかなという方針で進めていくべきかなと思いました。  
ありがとうございました。


CC BY-SA 4.0
2019-07-31T12:03:26.137
57074
2019-07-31T12:11:15.327
2019-07-31T12:11:15.327
35267
35267
56916
answer