Android進程間通訊之socket通訊

用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();
    }
}
相關文章
相關標籤/搜索