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("\r\n");
            }
            
            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("\r\n");
            }
            
            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();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM