Android socket通信协议的封装和解析

Android socket通信协议的封装和解析,第1张

android socket通信协议的封装和解析,其实是和java一样的,都是通过>import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
import javautilArrayList;
import javautilList;
import javautilconcurrentExecutorService;
import javautilconcurrentExecutors;
public class Main {
    private static final int PORT = 9999;
    private List<Socket> mList = new ArrayList<Socket>();
    private ServerSocket server = null;
    private ExecutorService mExecutorService = null; //thread pool
    
    public static void main(String[] args) {
        new Main();
    }
    public Main() {
        try {
            server = new ServerSocket(PORT);
            mExecutorService = ExecutorsnewCachedThreadPool();  //create a thread pool
            Systemoutprintln("服务器已启动");
            Socket client = null;
            while(true) {
                client = serveraccept();
                //把客户端放入客户端集合中
                mListadd(client);
                mExecutorServiceexecute(new Service(client)); //start a new thread to handle the connection
            }
        }catch (Exception e) {
            eprintStackTrace();
        }
    }
    class Service implements Runnable {
            private Socket socket;
            private BufferedReader in = null;
            private String msg = "";
            
            public Service(Socket socket) {
                thissocket = socket;
                try {
                    in = new BufferedReader(new InputStreamReader(socketgetInputStream()));
                    //客户端只要一连到服务器,便向客户端发送下面的信息。
                    msg = "服务器地址:" +thissocketgetInetAddress() + "come toal:"
                        +mListsize()+"(服务器发送)";
                    thissendmsg();
                } catch (IOException e) {
                    eprintStackTrace();
                }
                
            }
            @Override
            public void run() {
                try {
                    while(true) {
                        if((msg = inreadLine())!= null) {
                            //当客户端发送的信息为:exit时,关闭连接
                            if(msgequals("exit")) {
                                Systemoutprintln("ssssssss");
                                mListremove(socket);
                                inclose();
                                msg = "user:" + socketgetInetAddress()
                                    + "exit total:" + mListsize();
                                socketclose();
                                thissendmsg();
                                break;
                                //接收客户端发过来的信息msg,然后发送给客户端。
                            } else {
                                msg = socketgetInetAddress() + ":" + msg+"(服务器发送)";
                                thissendmsg();
                            }
                        }
                    }
                } catch (Exception e) {
                    eprintStackTrace();
                }
            }
          /
            循环遍历客户端集合,给每个客户端都发送信息。
           /
           public void sendmsg() {
               Systemoutprintln(msg);
               int num =mListsize();
               for (int index = 0; index < num; index ++) {
                   Socket mSocket = mListget(index);
                   PrintWriter pout = null;
                   try {
                       pout = new PrintWriter(new BufferedWriter(
                               new OutputStreamWriter(mSocketgetOutputStream())),true);
                       poutprintln(msg);
                   }catch (IOException e) {
                       eprintStackTrace();
                   }
               }
           }
        }    
}

原文地址
>Binder是Android中一种跨进程通信方式,还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder。
从Framework角度来说,Binder又是ServiceManager连接各种Manager和相应ManagerService的桥梁,从应用层来说,它是客户端和服务端进行通信的媒介,绑定服务的时候服务端会返回一个包含服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。

在 build/generated/aidl_source_output_dir/debug/out 目录下会自动生成一个IBookManagerjava文件,它继承了IInterface接口。

IBookManagerjava里边声明了两个方法getBookList和addBook

同时声明了两个整型的id,标识两个方法,用于在transact过程中判断客户端发送请求的到底是哪个方法。

声明了一个内部类Stub,是一个Binder派生类,客户端和服务端都位于同一个进程时,方法不会走跨进程transact过程,而当连着处于不同的进程,就会走transact过程,这个邮它的内部类Proxy来完成。

Binder的唯一标识,一般用单签Binder的类名标识。

用户将服务端的Binder对象转换陈客户端所需的AIDL对象,这种转换是区分进程的,同一进程返回的是服务端的Stub对象本身,否则是系统封装后的Stubproxy对象。

返回当前的Binder对象。

这个方法运行于服务端的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由次方法来处理。参数code确定客户端的请求目标方法,参数data存放数据,请求完成后,reply中写入返回值,onTransact如果返回false,客户端会请求失败,可以用这个特性来做权限验证。

这个方法运行在客户端,当客户端远程调用次方法时。

Binder运行于服务端,可能由于某种原因异常终止,这个时候我们到服务端的Binder连接已经断裂。会导致调用远程失败,客户端功能受到影响。
Binder中提供linkToDeath和unlinkToDeath方法,通过linkToDeath给Binder设置死亡代理,当Binder死亡时,我们会收到用纸,就可以重新发起连接请求,从而恢复连接。

Binder连接池的主要作用是将每个业务模块请求统一发到远程Service中去执行,从而避免重复创建Service的过程。

ISecurityCenteraidl

IComputer aidl

SecurityCenterImpljava

ComputerImpljava

首先去绑定服务,绑定服务后,客户端可以通过它的queryBinder方法区获取各自对应的Binder。
通过CountDownLatch将bindService这一异步的 *** 作转换成同步 *** 作。Binder的调用过程可能是耗时的,因此不建议在主线程执行。
BinderPool可以方便日常AIDL的开发,如果需要添加新的AIDL,只需要实现自己的AIDL之后,把BinderPoolImpl中的queeyBinder方法进行修改,添加一个新的binderCode并返回对应的Binder对象即可。

大 学学习网络基础的时候老师讲过,网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,我知道IP协议对应于网 络层,TCP协议对应于传输层,而>

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10256785.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存