用Java中的socket編程。java
經過socket實現兩個應用之間的通訊,能夠接收和發送數據,同時將接收到的數據顯示在activity界面上。android
Server端:編程
ServerLastly.java服務器
package com.example.driverexam; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import android.os.Handler; import android.os.Message; import android.util.Log; /** * 經過Socket實現 * @author Administrator * */ public class ServerLastly implements Runnable{ private static final String TAG="ServerLastly"; ServerSocket server; Socket client; PrintWriter os; BufferedReader is; Handler handler; /** * 此處不將鏈接代碼寫在構造方法中的緣由: * 我在activity的onCreate()中建立示例,若是將鏈接代碼 寫在構造方法中,服務端會一直等待客戶端鏈接,界面沒有去描繪,會一直出現白屏。 * 直到客戶端鏈接上了,界面纔會描繪出來。緣由是構造方法阻塞了主線程,要另開一個線程。在這裏我將它寫在了run()中。 */ ServerLastly(Handler handler){ this.handler=handler; // Log.i(TAG, "Server=======打開服務========="); // try { // server=new ServerSocket(8888); // client=server.accept(); // Log.i(TAG, "Server=======客戶端鏈接成功========="); // InetAddress inetAddress=client.getInetAddress(); // String ip=inetAddress.getHostAddress(); // Log.i(TAG, "===客戶端ID爲:"+ip); // 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 ServerSocket(8080); client=server.accept(); Log.i(TAG, "Server=======客戶端鏈接成功========="); InetAddress inetAddress=client.getInetAddress(); String ip=inetAddress.getHostAddress(); Log.i(TAG, "===客戶端ID爲:"+ip); 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); //把數據帶回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.javaapp
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(); // 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端:socket
ClientLastly.javaide
package com.fqhx.remoteserviceclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import android.os.Handler; import android.os.Message; import android.util.Log; /** * 經過socket實現 * @author Administrator * */ public class ClientLastly implements Runnable{ private static final String TAG="ClientLastly"; private static final String NAME="com.repackaging.localsocket"; private int timeout=30000; Socket client; PrintWriter os; BufferedReader is; Handler handler; ClientLastly(Handler handler){ this.handler=handler; // try { // //鏈接服務器 // client=new Socket("localhost", 8888); // 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){ Log.i(TAG, "Client=======data========="); if (os!=null) { os.println(data); os.flush(); } } //接收據 @Override public void run() { try { //鏈接服務器 // client=new Socket("192.168.191.1", 8080); client=new Socket("localhost", 8080); 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.javathis
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(); // 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(); } }