android使用socket通信聊天程序,线程使用问题

1.为了可以多个Activity共享Socket对象,在Application中定义Socket对象;

   

    遇到的错误:

     

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()),两边流类型不同,所以导致阻塞,无法通信。

   特别注意:务必注意两边同时建立socket.getOutputStream和socket.getInputStream,不然一边会陷入阻塞,除非将其放入线程中执行,然后像这样

                   判断是否为null是不可能有结果的。  

ois = new ObjectInputStream(socket.getInputStream()); 
oos = new ObjectOutputStream(socket.getOutputStream());
if(ois != null){
Log.d("clientinputthread", "oos is not null");
}

     正确写法:

         

客户端:

 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类就好了。

 

原文地址:https://www.cnblogs.com/wangguangjian/p/8762312.html