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中的transient关键字
    【笔记】html的改变(上)
    《开发板 — 实现看门狗》
    《头文件导致Symbol xxx multiply defined重复定义问题分析和解决》
    《APP读取按键值》
    《补充 — Linux内核device结构体分析(转)》
    《设备树LED模板驱动程序》
    《C库 — 字符串和整型数相互转换函数atoi和itoa》
    《Ubuntu — rsync命令》
    《Ubuntu — 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别》
  • 原文地址:https://www.cnblogs.com/wangguangjian/p/8762312.html
Copyright © 2011-2022 走看看