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