嘗試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();
