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高级工程师面试题总结及参考答案
    Java面试通关要点汇总整理【终极版】
    40道Java基础常见面试题及详细答案
    Java方向如何准备BAT技术面试答案(汇总版)
    10-01 Java 类,抽象类,接口的综合小练习--运动员和教练
    div在页面垂直居中方法---增强改进版
    TortoiseSVN切换更改登录账号密码
    09-04 java 接口
    09-03 Java 抽象类
    09-02 java 多态
  • 原文地址:https://www.cnblogs.com/wangguangjian/p/8762312.html
Copyright © 2011-2022 走看看