zoukankan      html  css  js  c++  java
  • 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类就好了。

     

  • 相关阅读:
    2019年4月18日 查询功能 2
    bzoj3601
    bzoj2693
    bzoj2440
    bzoj3529
    bzoj2820
    BZOJ2813
    BZOJ4515
    AtCoder Grand Contest 001 题解
    BZOJ2757
  • 原文地址:https://www.cnblogs.com/wangguangjian/p/8762312.html
Copyright © 2011-2022 走看看