zoukankan      html  css  js  c++  java
  • Android进程间通信之LocalSocket通信

    LocalSocket,在Unix域名空间创建的一个套接字(非服务端)。

    是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信。

    具体就是Native层Server和Framework层Client之间进行通信,或在各层次中能使用Client/Server模式实现通信。

    在这里通过LocalSocket实现应用之间的通信,可以接收、发送数据,同时将接收到的数据通过activty显示。

    Server端:

    package com.example.driverexam;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    
    import android.net.Credentials;
    import android.net.LocalServerSocket;
    import android.net.LocalSocket;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    /**
     * 通过LocalSocket实现
     * @author Administrator
     *
     */
    public class ServerFinally implements Runnable{
        private static final String TAG="ServerFinally";
        LocalServerSocket server;
        LocalSocket client;
        PrintWriter os;
        BufferedReader is;
        
        Handler handler;
        
        /**
         * 此处不将连接代码写在构造方法中的原因:
         * 我在activity的onCreate()中创建示例,如果将连接代码 写在构造方法中,服务端会一直等待客户端连接,界面没有去描绘,会一直出现白屏。
         * 直到客户端连接上了,界面才会描绘出来。原因是构造方法阻塞了主线程,要另开一个线程。在这里我将它写在了run()中。
         */
        ServerFinally(Handler handler){
            this.handler=handler;
            
    //        try {
    //            Log.i(TAG, "Server=======打开服务=========");
    //            server=new LocalServerSocket("com.repackaging.localsocket");
    //            client=server.accept();
    //            Log.i(TAG, "Server=======客户端连接成功=========");
    //            Credentials cre=client.getPeerCredentials();
    //            Log.i(TAG, "===客户端ID为:"+cre.getUid());
    //            os=new PrintWriter(client.getOutputStream());
    //            is=new BufferedReader(new InputStreamReader(client.getInputStream()));
    //        } catch (IOException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
        }
        
        //发数据
        public void send(String data){
            if (os!=null) {
                os.println(data);
                os.flush();
            }
        }
            
        //接数据
        @Override
        public void run() {
            Log.i(TAG, "Server=======打开服务=========");
            try {
                server=new LocalServerSocket("com.repackaging.localsocket");
            
                
                client=server.accept();
                Log.i(TAG, "Server=======客户端连接成功=========");
                Credentials cre=client.getPeerCredentials();
                Log.i(TAG, "===客户端ID为:"+cre.getUid());
                os=new PrintWriter(client.getOutputStream());
                is=new BufferedReader(new InputStreamReader(client.getInputStream()));
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            String result="";
            while(true){
                try {
                    result=is.readLine();
                    Log.i(TAG, "服务端接到的数据为:"+result);
                    //把数据带回activity显示
                    Message msg=handler.obtainMessage();
                    msg.obj=result;
                    msg.arg1=0x11;
                    handler.sendMessage(msg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
        
        public void close(){
            try {
                if (os!=null) {
                    os.close();
                }
                if (is!=null) {
                    is.close();
                }
                if(client!=null){
                    client.close();
                }
                if (server!=null) {
                    server.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }

    ServerFinallyActivity.java

    package com.example.driverexam;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class ServerFinallyActivity extends Activity {
        
        EditText et_serverSend;
        TextView tv_showReceiveData;
        
        ServerFinally server;
        
    //    ServerLastly server;
        StringBuffer receiveData=new StringBuffer();
        
        Handler handler=new Handler(new Handler.Callback() {
            
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.arg1==0x11) {
                    receiveData.append((String)msg.obj);
                    tv_showReceiveData.setText(receiveData);
                    receiveData.append("
    ");
                }
                
                return false;
            }
        });
        
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            
            setContentView(R.layout.activity_server_finally);
            et_serverSend=(EditText) findViewById(R.id.et_serverSend);
            tv_showReceiveData=(TextView) findViewById(R.id.tv_showReceiveData);
            
            server=new ServerFinally(handler);
            new Thread(server).start();
            
    //        server=new ServerLastly(handler);
    //        new Thread(server).start();
            
        }
    
        //发数据
        public void btn_serverSend(View view){
            server.send(et_serverSend.getText().toString()+"");
            et_serverSend.setText("");
        }
        
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
            server.close();
        }
            
    }

    Client端:

    ClientFinally.java

    package com.fqhx.remoteserviceclient;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    
    import android.net.LocalSocket;
    import android.net.LocalSocketAddress;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    /**
     * 通过LocalSocket实现
     * @author Administrator
     *
     */
    public class ClientFinally implements Runnable{
        private static final String TAG="ClientFinally";
        private static final String NAME="com.repackaging.localsocket";
        private int timeout=30000;
        LocalSocket client;
        PrintWriter os;
        BufferedReader is;
        
        Handler handler;
        
        ClientFinally(Handler handler){
            this.handler=handler;
    //        client=new LocalSocket();
    //        try {
    //            client.connect(new LocalSocketAddress(NAME));//连接服务器
    //            Log.i(TAG, "Client=======连接服务器成功=========");
    //            client.setSoTimeout(timeout);
    //            os=new PrintWriter(client.getOutputStream());
    //            is=new BufferedReader(new InputStreamReader(client.getInputStream()));
    //        } catch (IOException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
        }
        
        //发数据
        public void send(String data){
            if (os!=null) {
                os.println(data);
                os.flush();
            }
        }
    
        @Override
        public void run() {
            client=new LocalSocket();
            try {
                client.connect(new LocalSocketAddress(NAME));//连接服务器
                Log.i(TAG, "Client=======连接服务器成功=========");
                client.setSoTimeout(timeout);
                os=new PrintWriter(client.getOutputStream());
                is=new BufferedReader(new InputStreamReader(client.getInputStream()));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            String result="";
            while(true){
                try {
                    result=is.readLine();
                    Log.i(TAG, "客户端接到的数据为:"+result);
                    //将数据带回acitvity显示
                    Message msg=handler.obtainMessage();
                    msg.arg1=0x12;
                    msg.obj=result;
                    handler.sendMessage(msg);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
    
        public void close(){
            try {
                if (os!=null) {
                    os.close();
                }
                if (is!=null) {
                    is.close();
                }
                if(client!=null){
                client.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }

    ClientFinallyActivity.java

    package com.fqhx.remoteserviceclient;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class ClientFinallyActivity extends Activity {
        
        ClientFinally client;
        EditText et_clientSend;
        TextView tv_showReceiveDataClient;
        
    //    ClientLastly client;
        StringBuffer receiveData=new StringBuffer();
        
        Handler handler=new Handler(new Handler.Callback() {
            
            @Override
            public boolean handleMessage(Message msg) {
                if (msg.arg1==0x12) {
                    receiveData.append((String)msg.obj);
                    tv_showReceiveDataClient.setText(receiveData);
                    receiveData.append("
    ");
                }
                
                return false;
            }
        });
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_client_finally);
            
            et_clientSend=(EditText) findViewById(R.id.et_clientSend);
            tv_showReceiveDataClient=(TextView) findViewById(R.id.tv_showReceiveDataClient);
            
            client=new ClientFinally(handler);
            new Thread(client).start();
            
    //        client=new ClientLastly(handler);
    //        new Thread(client).start();
        }
    
        
        public void btn_clientSend(View view){
            client.send(et_clientSend.getText().toString()+"");
            et_clientSend.setText("");
        }
        
        @Override
        protected void onDestroy() {
            super.onDestroy();
            client.close();
        }
    }
  • 相关阅读:
    鸿合爱学班班.kl课件转ppt课件
    Mac下Android Studio添加忽略文件的方法
    Android中处理PPI
    Mac下配置全局gradlew命令
    Application启动图
    图像合成模式XferMode
    path绘制
    drawArc 画扇形 画弧线
    okhttp请求完整流程图
    责任链模式
  • 原文地址:https://www.cnblogs.com/Joanna-Yan/p/4708400.html
Copyright © 2011-2022 走看看