Android應用通過socket與pc通信的示例代碼
在Android中可以直接利用java中的Socket與ServerSocket構建socket通信。
代碼的運行環境:
pc端:普通pc,作為服務器,已經設置有域名(通過動態域名軟件設置),在5648端口進行監聽。
Android手機客戶端:android2.3設備。
代碼運行一切正常,客戶端發送的文字將在服務器端接收并顯示,服務器每接收到客戶端的一行文字,就會返回一個從0開始遞增的整數,此整數將在客戶端顯示出來。
pc端代碼:
package test;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket;
public class Test implements Runnable{
/** * @param args */ int max=10; //最大開啟線程數 int i=0; //回復數字 int temp; ServerSocket serverSocket; Socket socket[]; public Test(){ try { serverSocket=new ServerSocket(5648); //在5648端口進行偵聽 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("can't initate ServerSocket!"); return; } socket=new Socket[max]; System.out.println("waiting for connect"); try { while((socket[i]=serverSocket.accept())!=null){ temp=i; i++; new Thread(this).start(); //每偵聽到一個客戶端的連接,就會開啟一個工作線程 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { new Test(); } @Override public void run() { Socket sk=socket[temp]; System.out.println("accept:"+sk.getInetAddress().getHostAddress()); InputStream is=null; OutputStream os=null; BufferedReader br=null; PrintWriter pw=null; try { is=sk.getInputStream(); os=sk.getOutputStream(); br=new BufferedReader(new InputStreamReader(is)); pw=new PrintWriter(os); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); try { sk.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return; } String str; try { int m=0; while((str=br.readLine())!=null){ System.out.println(str); pw.println(m); pw.flush(); m++; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
} </pre>
android設備客戶端代碼:
MainActivity.java代碼:import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener,Runnable{
private Button button; private EditText editText; private Socket socket; private PrintWriter pw; private BufferedReader br; private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler=new Handler(); button=(Button)findViewById(R.id.button); button.setOnClickListener(this); editText=(EditText)findViewById(R.id.edittext); try { socket=new Socket("tobacco5648.xicp.net",5648); //連接到tobacco5648.xicp.net的5648端口
} catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e("socket","unknown host"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e("socket","io execption"); } if(socket==null){ Log.e("socket","null"); } else try { pw=new PrintWriter(socket.getOutputStream()); br=new BufferedReader(new InputStreamReader(socket.getInputStream())); if(pw!=null&&br!=null){ new Thread(this).start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void onClick(View view) { if(view==button){ String str; str=editText.getText().toString(); pw.println(str); pw.flush(); } } public void run() { try { String str; while((str=br.readLine())!=null){ final String s=str; handler.post(new Runnable(){ public void run() { Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show(); }}); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}</pre>