Android socket和Tomcat等網(wǎng)絡(luò)連接不上問(wèn)題解決方案
最近在玩android,學(xué)習(xí)到網(wǎng)絡(luò)這一部分,寫(xiě)了一個(gè)電腦本機(jī)做服務(wù)器,模擬器做客戶(hù)端的socket通信程序,但手機(jī)模擬器客戶(hù)端就是連不上電腦的服務(wù)器端,執(zhí)行到Socket socket=new Socket("xx.xx.xxx.xxx",8888);就拋異常。我又自己寫(xiě)了一個(gè)普通的Java客戶(hù)端,測(cè)試能連上服務(wù)器端。所以代碼應(yīng)該沒(méi)有問(wèn)題,問(wèn)題就在于手機(jī)模擬器。同學(xué)的電腦上裝了2.0的android模擬器,我用同學(xué)的手機(jī)模擬器測(cè)試也能連上服務(wù)器端。所以可能是模擬器版本的問(wèn)題。幾經(jīng)周折,無(wú)法解決,暫且擱置。
緊接著,我又寫(xiě)了一個(gè)通過(guò)Http去請(qǐng)求Tomcat 服務(wù)器上的資源,執(zhí)行到DefaultHttpClient().execute(httpPostRequest)就拋異常,但在模擬器的瀏覽器上通過(guò)同樣的地址就可以訪(fǎng)問(wèn)到資源,百度之沒(méi)解決。
感覺(jué)很郁悶,網(wǎng)絡(luò)的兩個(gè)程序都被擱置了,但感覺(jué)它們的錯(cuò)誤原因應(yīng)該是一樣。故又單步調(diào)試之,發(fā)現(xiàn) socket程序出現(xiàn)android.os.NetworkOnMainThreadException異常,百度之,終于找到前兩個(gè)程序失敗的原因了,我用的是Android 4.0版本,而Android 3.0以上對(duì)網(wǎng)絡(luò)有了更多的限制。
總結(jié)如下, Android網(wǎng)絡(luò)編程要注意以下兩點(diǎn):
一。android里自己電腦的IP地址是10.0.2.2,不能用127.0.0.1或者localhost,即最好使用自己電腦的IP
二。Android 3.0以上不能在android的主線(xiàn)程中執(zhí)行一個(gè)網(wǎng)絡(luò)操作,否則會(huì)出現(xiàn) android.os.NetworkOnMainThreadException異常,因?yàn)橹骶€(xiàn)程的操作
不能超過(guò)5秒,否則就報(bào)錯(cuò)了,解決方法:
(1)另開(kāi)一個(gè)線(xiàn)程去做網(wǎng)絡(luò)連接的操作;
(2)在activity類(lèi)中的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());?????
}????
?
問(wèn)題解決了,很是高興呀,呵呵