1.爲了能夠多個Activity共享Socket對象,在Application中定義Socket對象;java
遇到的錯誤:android
import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import android.app.Application; public class MyApplication extends Application { //當一個安卓程序啓動時最新執行的是Application類,而後纔是入口Activity //由於application在安卓中是全局的,且他的生命週期爲整個app運行的生命週期 //因此,能夠考慮把一些多個activity都要用到的全局的東西在application中實例化 private Socket socket; public void onCreate() { // TODO Auto-generated method stub super.onCreate(); socket = new Socket("10.0.2.2",8888);//直接在onCreate()方法中實例化,程序直接閃退。正確作法是新建一個線程,在線程中實例化。 } }
import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import android.app.Application; public class MyApplication extends Application { //當一個安卓程序啓動時最新執行的是Application類,而後纔是入口Activity //由於application在安卓中是全局的,且他的生命週期爲整個app運行的生命週期 //因此,能夠考慮把一些多個activity都要用到的全局的東西在application中實例化 private Socket socket; public void onCreate() { // TODO Auto-generated method stub super.onCreate(); new Thread(){ public void run(){ socket = new Socket("10.0.2.2",8888); //這樣就能夠了。 } }.start(); } }
2. 在執行這句代碼 ois = new ObjectInputStream(socket.getInputStream());的時候老是閃退,ois對象也是null,後來找到緣由是,服務器端服務器
寫的是ois = new DataInputStream(socket.getInputStream()),兩邊流類型不一樣,因此致使阻塞,沒法通訊。
app
特別注意:務必注意兩邊同時創建socket.getOutputStream和socket.getInputStream,否則一邊會陷入阻塞,除非將其放入線程中執行,而後像這樣
socket
判斷是否爲null是不可能有結果的。 spa
ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); if(ois != null){ Log.d("clientinputthread", "oos is not null"); }
正確寫法:.net
客戶端: oos = new ObjectOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); 服務器端: ois = new ObjectInputStream(s.getInputStream()); oos = new ObjectOutputStream(s.getOutputStream()); //必定要注意順序,客戶端是input對應服務器端output
3.對象逆序列化報錯,客戶端發送消息的封裝類所在的包,要和服務器端相同。否則會報如圖錯誤,只要在服務器端新建hq.king.entity包,粘貼客戶端的User類就行了。線程