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

 

相关文章
相关标签/搜索