嘗試Android寫Socket通信的時候,遇到的個坑,記錄一下:
1、無法建立連接。
原因:沒有添加網絡使用權限請求;
解決方式:在"AndroidMainfest.xml"中添加<uses-permission android:name="android.permission.INTERNET"/>
2、建立連接后正常接收信息,但發送信息時直接閃退,LogCat中異常提示為:android.os.NetworkOnMainThreadException
原因:百度了一圈,發現是在Android 7版本后才出現的,對主線程上的一個TCP Socket的寫入操作嚴格檢查,也就是不能在主線程中進行Socket寫入發送。
解決方式:新建線程發送。
3、新建發送信息的線程,仍然閃退
原因:輸出流也需要在新建的線程中new一個
成功發送的代碼如下
new Thread(new Runnable(){ @Override public void run() { try { //輸出流寫入發送編輯框的信息並指定類型UTF-8,注意要加換行 String str="TestString"; if(socket==null) return; BufferedWriter outputStream=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); outputStream.write(str); //輸出流發送至服務器 outputStream.flush(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start();