2013年5月6日 星期一

[Android][JAVA] Android 與 PC JAVA 間的 Socket 連線(Android Client Java Server)

要讓 Android 與一般的 Java 程式透過網路溝通,我們最習慣的是使用 Socket 來做連線,而使用一般的 java 寫法可能會發現無法建立連線。

因為兩端皆須透過 Thread 使用額外的執行緒來處理建立連線這塊,可以參考以下的做法:

(本範例僅供連線通訊端的程式碼,並無做加密的控制)





Android Client

package com.example.androidclient;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

 static EditText ed;
 static TextView tv1,tv2;
 static Button btn ;
 static String str1="0",str2="0";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //先建立好與XML的元件連結
        ed = (EditText) findViewById(R.id.edt);
        tv1 = (TextView) findViewById(R.id.show01);
        tv2 = (TextView) findViewById(R.id.show02);
        btn = (Button) findViewById(R.id.btn);
        //撰寫一個按鈕事件,當按下按鈕時,才啟動一些功能
        btn.setOnClickListener(new OnClickListener() 
        {public void onClick(View arg0) 
  {
         //建立 thread 的物件
         Thread t = new thread();
            //啟動thread
         t.start();
            try {
             //先讓他等待個 3 秒
       t.sleep(3000);
      } catch (InterruptedException e) {}
            //之後在讓它顯示在銀幕上,有時網路不夠穩時,傳輸會較慢,而導致傳誦與接收都尚未完成,便顯示到銀幕上了
            tv1.setText(str1);
            tv2.setText(str2);
  }});    
    }
    class thread extends Thread{
     public void run() {
      try{
      System.out.println("Waitting to connect......");
      String server=ed.getText().toString();
      int servPort=1025;
      Socket socket=new Socket(server,servPort);
      InputStream in=socket.getInputStream();
      OutputStream out=socket.getOutputStream();
      System.out.println("Connected!!");
      byte[] rebyte = new byte[18];
      in.read(rebyte);
      str2 ="(Client端)接收的文字:"+ new String(new String(rebyte));
      String str = "android client string";
      str1 = "(Client端)傳送的文字:"+str;
      byte[] sendstr = new byte[21];
      System.arraycopy(str.getBytes(), 0, sendstr, 0, str.length());
      out.write(sendstr);
      }catch(Exception e)
      {
       System.out.println("Error: "+e.getMessage());
      }
      }
    }
}




Java Server

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class jSer extends Thread {

    public static void main(String[] argv) {
        Thread t = new thread(); 
        t.start(); 
        }
    }

class thread extends Thread{
 public void run() {
  try{
  System.out.println("Waitting to connect......");
  ServerSocket servSock=new ServerSocket(1025);
  Socket clntSock=servSock.accept();
  InputStream in=clntSock.getInputStream();
  OutputStream out=clntSock.getOutputStream();
  System.out.println("Connected!!");
  String str = "java server string";
  System.out.println("(Server端)傳送的字串:"+str);
  byte[] sendstr = new byte[18];
  System.arraycopy(str.getBytes(), 0, sendstr, 0, str.length());
  out.write(sendstr);
  
  byte[] re = new byte[21];
  in.read(re);
  String s = new String(re);
  System.out.println("(Server端)接收的字串:"+s);
  }catch(Exception e)
  {
   System.out.println("Error: "+e.getMessage());
  }
  }
}



專案檔下載:file