android使用socket通訊聊天程序,線程使用問題

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類就行了。線程

 

相關文章
相關標籤/搜索