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(); } }