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类就行了。线程