2017-09-13 9 views
-1

最近、Javaソケットを使用してPCのjavaサーバーソケットに接続できるアプリケーションを開発しました。このコードは、スレッドが呼び出された直後にStringを送信するサーバーに接続すると完璧に動作しますが、サーバーを閉じて試してみるとわかりませんが、すぐに例外がスローされませんでした。ページが呼び出されました。1分後にソケットスロー例外が発生する

ここ

logcatファイルサーバが開いていて、ときにも近いこと: あなたはソケットのタイムアウト値を指定する必要がhttps://imgur.com/a/lOqdq

public class checksession implements Runnable 
    { 
    private Activity activity; 
    Socket soc; 

    public checksession(Activity activity) 
    { 
     //get activity from class called 
     this.activity=activity; 
     //this.soc=soc; 

    } 


    @Override 
    public void run() 
    { 
     try{ 

      soc=new Socket("192.168.0.113",11000); 


      DataOutputStream dout=new DataOutputStream(soc.getOutputStream()); 


      //request format --> requestkey-field required 
      //format for LG request--> LG-username-password 
      String sendrequest="SS"; 

      //send requestcode to server 
      dout.writeUTF(sendrequest); 
      dout.flush();//refresh to make sure it send to the server 

      //wait for input 
      DataInputStream dis=new DataInputStream(soc.getInputStream()); 
      final String codefromserver=(String)dis.readUTF(); 
      System.out.println("reply:"+codefromserver); 


      String replycode[]= codefromserver.split("-"); 

      //server reply code format 
      // if not used on database RE-CK-NO 
      //if used on database RE-CK-YES 

      String sessionavailableornot=replycode[2]; 

      if(sessionavailableornot.equals("YES")) 
      { 
       activity.runOnUiThread(new Runnable() { 
        public void run() { 
         //Do your UI operations like dialog opening or Toast here 
         //navigate user to main screen 
         Intent in = new Intent(activity, sessiondetected.class); 
         in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         activity.startActivity(in); 
        } 
       }); 

      } 

      soc.close(); 

     }catch(Exception e) { 
      //runOnUiThread function is to let the function to be run on main thread 
      //bacause UI function cannot be run on worker thread 
      activity.runOnUiThread(new Runnable() { 
       public void run() { 
        //Do your UI operations like dialog opening or Toast here 
        //navigate user back to connectionerror page so that user know 
        Intent inerr = new Intent(activity, serverconnectionerror.class); 
        inerr.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        activity.startActivity(inerr); 
       } 
      }); 
     } 

    } 
} 
+1

あなたが 'SO_TIMEOUT 'を例えばに設定しようとするとどうなりますか? 'soc = new Socket(" 192.168.0.113 "、11000)の直後に' soc.setSoTimeout(2000);を2秒間置くと '? –

+0

ここでタイムアウトを設定していません。したがって、プラットフォームのデフォルトのタイムアウトは、接続タイムアウトの場合は約1分、読み取りタイムアウトの場合は無限大となります。あなたが何を求めているのか不明です。 – EJP

+0

@MickMnemonicそれでも同じタイムアウトを設定してもT_T –

答えて

0

。それ以外の場合は、プラットフォームのデフォルトが使用されます。

次のコードは、ソケットを開く前にSO_TIMEOUT(ソケット読み取りタイムアウト)と接続タイムアウト値を設定します。

final int timeout = 2000; // in millis 
soc = new Socket(); 
soc.setSoTimeout(timeout); 
soc.connect(new InetSocketAddress("192.168.0.113", 11000), timeout); 
関連する問題