Android socket和Tomcat等網(wǎng)絡連接不上問題解決方案
最近在玩android,學習到網(wǎng)絡這一部分,寫了一個電腦本機做服務器,模擬器做客戶端的socket通信程序,但手機模擬器客戶端就是連不上電腦的服務器端,執(zhí)行到Socket socket=new Socket("xx.xx.xxx.xxx",8888);就拋異常。我又自己寫了一個普通的Java客戶端,測試能連上服務器端。所以代碼應該沒有問題,問題就在于手機模擬器。同學的電腦上裝了2.0的android模擬器,我用同學的手機模擬器測試也能連上服務器端。所以可能是模擬器版本的問題。幾經(jīng)周折,無法解決,暫且擱置。
緊接著,我又寫了一個通過Http去請求Tomcat 服務器上的資源,執(zhí)行到DefaultHttpClient().execute(httpPostRequest)就拋異常,但在模擬器的瀏覽器上通過同樣的地址就可以訪問到資源,百度之沒解決。
感覺很郁悶,網(wǎng)絡的兩個程序都被擱置了,但感覺它們的錯誤原因應該是一樣。故又單步調試之,發(fā)現(xiàn) socket程序出現(xiàn)android.os.NetworkOnMainThreadException異常,百度之,終于找到前兩個程序失敗的原因了,我用的是Android 4.0版本,而Android 3.0以上對網(wǎng)絡有了更多的限制。
總結如下, Android網(wǎng)絡編程要注意以下兩點:
一。android里自己電腦的IP地址是10.0.2.2,不能用127.0.0.1或者localhost,即最好使用自己電腦的IP
二。Android 3.0以上不能在android的主線程中執(zhí)行一個網(wǎng)絡操作,否則會出現(xiàn) android.os.NetworkOnMainThreadException異常,因為主線程的操作
不能超過5秒,否則就報錯了,解決方法:
(1)另開一個線程去做網(wǎng)絡連接的操作;
(2)在activity類中的onCreate方法中添加strict代碼,如下:
Java代碼?
public void onCreate() {????
???? .......??
???? StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()???????
??????????? .detectDiskReads()???????
??????????? .detectDiskWrites()???????
??????????? .detectNetwork()?? // or .detectAll() for all detectable problems???????
??????????? .penaltyLog()???????
??????????? .build());???????
???? StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()???????
??????????? .detectLeakedSqlLiteObjects()????
??????????? .penaltyLog()???????
??????????? .penaltyDeath()???????
??????????? .build());?????
}????
?
問題解決了,很是高興呀,呵呵