2012-12-14 71 views
0

我知道這似乎是一個重複的問題,但實際上並非如此。我想通過套接字與一些傳感器進行通信。模擬器上的連接工作正常,但是當我在Android設備上上傳時,它無法工作。調試後,我縮小了我的應用程序,使用下面的代碼簡單地打開套接字。在Android設備上打開套接字

try 
{ 
Socket socket = new Socket(InetAddress.getByName(ipAddress).getHostAddress(), 10001); 
} 
catch (Exception e) 
{ 
Toast.makeText(context, "Error: "+e.getMessage(), duration).show(); 
} 

我只是打開一個socket.This工作在模擬器罰款,但是當我在設備上運行這個程序,它掛了一段時間,並顯示我什麼也不例外消息...任何想法可能是什麼成爲問題。 (最初它是StrictMode問題,但我整理出來了)。 LogCat沒有錯誤。我已經安裝了android終端模擬器,並嘗試ping,答覆很好。在此先感謝


這是代碼

import java.net.InetAddress; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 

public class MainActivity extends Activity implements OnClickListener { 
    Button btn; 
    private CharSequence text = ""; 
    private Socket s; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
     .detectDiskReads() 
     .detectDiskWrites() 
     .detectNetwork() // or .detectAll() for all detectable problems 
     .penaltyLog() 
     .build()); 
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() 
     .detectLeakedSqlLiteObjects() 
     .detectLeakedClosableObjects() 
     .penaltyLog() 
     .penaltyDeath() 
     .build()); 

     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_main); 
     btn = (Button) findViewById(R.id.button1); 
     btn.setOnClickListener(this); 
    } 

    public void onClick(View view){ 
     //detect the view that was "clicked" 
     switch(view.getId()) 
     { 
      case R.id.button1: 
       new LongOperation().execute(""); 
      break; 

     } 

    } 

    private class LongOperation extends AsyncTask<String, Void, String> { 

      @Override 
      protected String doInBackground(String... params) { 

       try { 
        s = new Socket(InetAddress.getByName("o2215.airq.org").getHostAddress(), 10001); 
        text = "Connection Made"; 
       } catch (Exception e) { 
        text = "Error : "; 
        for(int i=0;i<e.getStackTrace().length;i++) 
        { 
         text = text +"\n"+ e.getStackTrace()[i]; 
        } 
        e.printStackTrace(); 
       } 
       return ""; 
      }  

      @Override 
      protected void onPostExecute(String result) { 
       TextView txt = (TextView) findViewById(R.id.output); 
       txt.setText(text); 
      } 
    } 
} 

也能正常工作在模擬器上,而不是在設備上。

+0

我想你想到的所有權限的東西?如果不是,應該會導致異常,但是你沒有提到,所以我只是要求確定。你有沒有嘗試過,如果你可以從別的地方(除了模擬器)打開目標連接? – Fildor

+0

ipAddress究竟是什麼?模擬器和設備的地址可能不同(因爲模擬器必須通過主機的操作系統)。 – SirRichie

+0

@Fildor是的我已經給了這些權限 我想這就是爲什麼它在模擬器上工作,否則會導致異常。是的,我可以從任何瀏覽器連接到目標,就像我說我用終端仿真器ping它,工作正常。 –

回答

0

也許,這是因爲您嘗試在主UI線程中建立連接。看起來像你把上面的代碼片段放在你的Activity類中。

您應該創建一個單獨的線程來與網絡進行通信。

使用是簡單Thread或Android的精彩AsyncTask

+0

感謝您的回覆我嘗試使用AsyncTask,但沒有成功,但設備現在不掛(當然它運行在後臺)。 但至少我得到了一些錯誤 libcore.io.IoBridge.connect(IoBridge.java:114) java.net.PlainSocketImpl.connect(PlainSocketImpl.java.192) java.net.PlainSocketImpl.connect(PlainSocketImpl.java .172) java.net.Socket.startupSocket(Socket.java:566) –

+1

對於我們來說,如果您要在建立連接的位置添加一段擴展代碼,因爲查看堆棧跟蹤,似乎你使用第三方庫,我們需要確切地知道。 –

+0

謝謝...我發佈了我的代碼..... –

相關問題