0

私のAndroidアプリでは、ローカルサーバーのポートに接続してパケットを取得しようとしています。私はいくつかのtry&catchのコードに入れましたが、次のコードを使用します。

address = "192.168.175.82";
public void run() {
    try {
  smtpSocket = new Socket(address, 60001);

        os = new DataOutputStream(smtpSocket.getOutputStream());
        is = new DataInputStream(smtpSocket.getInputStream());
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: " + address);
        run();
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: " + address);
        run();
    } catch (Exception e) {
     System.out.println("retry");
     run();
    }

サーバーがオンになっていない場合、スタックオーバーフローエラーが発生してアプリがクラッシュする前に、明らかにIOExceptionが数回(たとえば数百回)発生します。

01-20 22:21:32.526: ERROR/AndroidRuntime(5678): java.lang.StackOverflowError
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.util.Hashtable.get(Hashtable.java:282)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.util.Properties.getProperty(Properties.java:177)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.lang.System.getProperty(System.java:440)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.lang.System.getProperty(System.java:412)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.lang.Boolean.getBoolean(Boolean.java:174)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at org.apache.harmony.luni.net.NetUtil$Action.run(NetUtil.java:89)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at org.apache.harmony.luni.net.NetUtil$Action.run(NetUtil.java:80)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.security.AccessController.doPrivilegedImpl(AccessController.java:264)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.security.AccessController.doPrivileged(AccessController.java:84)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at org.apache.harmony.luni.net.NetUtil.preferIPv6Addresses(NetUtil.java:51)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.net.Socket.startupSocket(Socket.java:777)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.net.Socket.tryAllAddresses(Socket.java:192)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.net.Socket.<init>(Socket.java:256)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at java.net.Socket.<init>(Socket.java:220)
01-20 22:21:32.526: ERROR/AndroidRuntime(5678):     at com.example.sockets.ReadSocket.run(ReadSocket.java:83)

誰かがこれを機能させる方法の正しい方向に私を向けてくれませんか?おそらく、最初に接続をテストする必要があります(もしそうなら、どのように言ってください?)ありがとう

クリス

4

2 に答える 2

2

手始めに、再帰呼び出しをドロップします。これにより、スタックオーバーフローが解消されます。ループに置き換えて、失敗した反復ごとにスリープします

  public void run() {
     boolean connected = false;  
     while(!connected)
     {
     try {
      smtpSocket = new Socket(address, 60001);

            os = new DataOutputStream(smtpSocket.getOutputStream());
            is = new DataInputStream(smtpSocket.getInputStream());


      connected = true;
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: " + address);

    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: " + address);

        } catch (Exception e) {
         System.out.println("retry");

        }
        if (!connected)
            Thread.sleep(1000)
      }
    }
于 2010-08-09T11:50:19.930 に答える
0

入力ストリームを取得する前に、ソケットを試しisConnected()て、isBound()接続されているかどうかを確認できます。

于 2010-08-09T11:38:39.647 に答える