本文執行個體分析了Android中Socket的應用。分享給大家供大家參考,具體如下:
Android 提供的常用的網路編程包括針對TCP/IP協議的Socket通訊。Socket是一種跨平台的編程方式,可以在異構語言之間進行通訊。
Socket程式的開發原理,是要實現伺服器端和用戶端。
伺服器,使用ServerSocket監聽指定的連接埠,連接埠可以隨意指定(由於1024以下的連接埠通常屬於保留連接埠,在一些作業系統中不可以隨意使用,所以建議使用大於1024的連接埠),等待客戶串連請求,客戶串連後,會話產生;在完成會話後,關閉串連。
用戶端,使用Socket對網路上某一個伺服器的某一個連接埠發出串連請求,一旦串連成功,開啟會話;會話完成後,關閉Socket。用戶端不需要指定開啟的連接埠,通常臨時的、動態分配一個1024以上的連接埠。
下面是一個實現socket的例子:
伺服器端代碼:
package com.socket;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/*** com Server*/public class Main { private int ServerPort = 9999; private ServerSocket serversocket = null; private OutputStream outputStream = null; private InputStream inputStream = null; private PrintWriter printWinter = null; private Socket socket = null; private BufferedReader reader = null; public Main(){ try{ serversocket = new ServerSocket(ServerPort); System.out.println("服務啟動。。。"); socket = serversocket.accept(); System.out.println("客戶已串連"); }catch(Exception ex){ ex.printStackTrace(); } try{ outputStream= socket.getOutputStream(); inputStream = socket.getInputStream(); printWinter = new PrintWriter(outputStream,true); reader = new BufferedReader(new InputStreamReader(inputStream)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while (true){ String message = reader.readLine(); System.out.println("client:"+message); if(message.equals("bye")||message.equals("Bye")){ break; } message = in.readLine(); printWinter.println(message); } outputStream.close(); inputStream.close(); socket.close(); serversocket.close(); System.out.print("Client is disconnected"); }catch(Exception e){ e.printStackTrace(); }finally{ } } public static void main(String[] args){ new Main(); }}
客服端代碼:
package com.Aina.Android;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class Test extends Activity implements Runnable {/** Called when the activity is first created. */private TextView tv_msg = null;private EditText ed_msg = null;private Button btn_send = null;private Button btn_login = null;private static final String HOST = "192.168.0.132";private static final int PORT = 9999;private Socket socket = null;private BufferedReader in = null;private PrintWriter out = null;private String content = "";@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv_msg = (TextView) this.findViewById(R.id.TextView); ed_msg = (EditText) this.findViewById(R.id.EditText01); btn_login = (Button) this.findViewById(R.id.Button01); btn_send = (Button) this.findViewById(R.id.Button02); try { socket = new Socket(HOST, PORT); in = new BufferedReader(new InputStreamReader(socket .getInputStream())); out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); } catch (Exception ex) { ex.printStackTrace(); ShowDialog("登陸異常:" + ex.getMessage()); } btn_send.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub String msg = ed_msg.getText().toString(); if (socket.isConnected()) { if (!socket.isOutputShutdown()) { out.println(msg); } } } }); new Thread(this).start();}public void ShowDialog(String msg) { new AlertDialog.Builder(this).setTitle("提示").setMessage(msg) .setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).show();}public void run() { try { while (true) { if(socket.isConnected()){ if(!socket.isInputShutdown()){ if ((content = in.readLine()) != null) { Log.i("TAG", "++ "+content); content += "\n"; mHandler.sendMessage(mHandler.obtainMessage()); }else{ } } } } } catch (Exception ex) { ex.printStackTrace(); }}public Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); Log.i("TAG", "-- "+msg); tv_msg.setText(tv_msg.getText().toString() + content); }};}
XML檔案布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent"><TextView android:id="@+id/TextView" android:singleLine="false" android:layout_width="fill_parent" android:layout_height="wrap_content" /><EditText android:hint="content" android:id="@+id/EditText01" android:layout_width="fill_parent" android:layout_height="wrap_content"></EditText><Button android:text="login" android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="send" android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button></LinearLayout>
先啟動伺服器端,再運行用戶端程式。
注意:
(一)即使伺服器端和用戶端在一台機器上運行,也不能使用ip地址:127.0.0.1,否則,程式會出現拒絕串連的錯誤。
(二)用戶端和伺服器端最好不要建在一個工程下,最好是分別建立工程,然後啟動伺服器端和用戶端,否則會報Error: ShouldNotReachHere()錯誤。這是因為Android程式不是已main方法為程式的入口。
運行效果:
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android通訊方式總結》、《Android調試技巧與常見問題解決方案匯總》、《Android開發入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控制項用法總結》
希望本文所述對大家Android程式設計有所協助。