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

     

  • 相关阅读:
    java学习(19-IO高级)
    java学习(18-异常)
    java学习(17-Map和Set)
    java学习笔记(16-集合)
    java学习笔记(15-高级api)
    java学习笔记(14-包和权限修饰符)
    Deno文件处理详解:如何写入文件、如何读文件、如何创建删除以及检查文件和目录。
    2020年12月8日建站随笔:IPlayIO中文网从上线到现在的一些总结
    2020 FreeBSD如何更换国内仓库源
    推荐11个值得研究学习的Python开源项目(从入门到python高级开发)
  • 原文地址:https://www.cnblogs.com/wangguangjian/p/8762312.html
Copyright © 2011-2022 走看看