下面是一個demo,Android用戶端通過socket與伺服器通訊。
由於Android裡面可以完全使用java.io.*包和java.net.*包,那麼,實際上,邏輯部分與J2SE沒有區別。只是UI代碼不一樣。
Android用戶端通過socket與伺服器通訊分為下面5步:
(1)通過IP地址和連接埠執行個體化Socket,請求串連伺服器;
socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,連接埠54321
(2)擷取Socket流以進行讀寫,並把流封裝進BufferWriter或者PrintWriter
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
這裡涉及了三個類:socket.getOutputStream得到socket的輸出位元組流,OutputStreamWriter是位元組流向字元流轉換的橋樑,BufferWriter是字元流,然後再封裝進PrintWriter。
(3)對Socket進行讀寫
out.println(message);
(4)關閉開啟的流
out.close();
完整工程代碼如下:
package com.yarin.android.Examples_08_04;</p><p>import java.io.BufferedReader;<br />import java.io.BufferedWriter;<br />import java.io.InputStreamReader;<br />import java.io.OutputStreamWriter;<br />import java.io.PrintWriter;<br />import java.net.Socket;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.Button;<br />import android.widget.EditText;<br />import android.widget.TextView;</p><p>public class Activity01 extends Activity<br />{<br />private final StringDEBUG_TAG= "Activity01";</p><p>private TextViewmTextView = null;<br />private EditTextmEditText = null;<br />private ButtonmButton = null;<br />/** Called when the activity is first created. */<br />@Override<br />public void onCreate(Bundle savedInstanceState)<br />{<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);</p><p>mButton = (Button)findViewById(R.id.Button01);<br />mTextView = (TextView)findViewById(R.id.TextView01);<br />mEditText = (EditText)findViewById(R.id.EditText01);</p><p>//登陸<br />mButton.setOnClickListener(new OnClickListener()<br />{<br />public void onClick(View v)<br />{<br />Socket socket = null;<br />String message = mEditText.getText().toString() + "/r/n";<br />try<br />{<br />//建立Socket<br />//socket = new Socket("192.168.1.110",54321);<br />socket = new Socket("10.14.114.127",54321); //IP:10.14.114.127,連接埠54321<br />//向伺服器發送訊息<br />PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);<br />out.println(message); </p><p>//接收來自伺服器的訊息<br />BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));<br />String msg = br.readLine(); </p><p>if ( msg != null )<br />{<br />mTextView.setText(msg);<br />}<br />else<br />{<br />mTextView.setText("資料錯誤!");<br />}<br />//關閉流<br />out.close();<br />br.close();<br />//關閉Socket<br />socket.close();<br />}<br />catch (Exception e)<br />{<br />// TODO: handle exception<br />Log.e(DEBUG_TAG, e.toString());<br />}<br />}<br />});<br />}<br />}<br />
布局檔案main.xml
<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><TextView<br />android:id="@+id/TextView01"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="這裡顯示接收到伺服器發來的資訊"<br /> /><br /><EditText<br />android:id="@+id/EditText01"<br />android:text="輸入要發送的內容"<br />android:layout_width="fill_parent"<br />android:layout_height="wrap_content"><br /></EditText><br /> <Button<br />android:id="@+id/Button01"<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:text="發送"<br /> /><br /></LinearLayout>
AndroidManifest.xml檔案如下
<?xml version="1.0" encoding="utf-8"?><br /><manifest xmlns:android="http://schemas.android.com/apk/res/android"<br /> package="com.yarin.android.Examples_08_04"<br /> android:versionCode="1"<br /> android:versionName="1.0"><br /> <application android:icon="@drawable/icon" android:label="@string/app_name"><br /> <activity android:name=".Activity01"<br /> android:label="@string/app_name"><br /> <intent-filter><br /> <action android:name="android.intent.action.MAIN" /><br /> <category android:name="android.intent.category.LAUNCHER" /><br /> </intent-filter><br /> </activity><br /> </application><br /><uses-permission android:name="android.permission.INTERNET"></uses-permission><br /> <uses-sdk android:minSdkVersion="5" /><br /></manifest>
當然,還有伺服器端得代碼
package com.yarin.android.Examples_08_04;</p><p>import java.io.BufferedReader;<br />import java.io.BufferedWriter;<br />import java.io.InputStreamReader;<br />import java.io.OutputStreamWriter;<br />import java.io.PrintWriter;<br />import java.net.ServerSocket;<br />import java.net.Socket;</p><p>public class Server implements Runnable<br />{<br />public void run()<br />{<br />try<br />{<br />//建立ServerSocket<br />ServerSocket serverSocket = new ServerSocket(54321);<br />while (true)<br />{<br />//接受用戶端請求<br />Socket client = serverSocket.accept();<br />System.out.println("accept");<br />try<br />{<br />//接收用戶端訊息<br />BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));<br />String str = in.readLine();<br />System.out.println("read:" + str);<br />//向伺服器發送訊息<br />PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);<br />out.println("server message");<br />//關閉流<br />out.close();<br />in.close();<br />}<br />catch (Exception e)<br />{<br />System.out.println(e.getMessage());<br />e.printStackTrace();<br />}<br />finally<br />{<br />//關閉<br />client.close();<br />System.out.println("close");<br />}<br />}<br />}<br />catch (Exception e)<br />{<br />System.out.println(e.getMessage());<br />}<br />}<br />//main函數,開啟伺服器<br />public static void main(String a[])<br />{<br />Thread desktopServerThread = new Thread(new Server());<br />desktopServerThread.start();<br />}<br />}<br />
先開啟伺服器代碼,
java Server即可
然後啟動android模擬器。運行結果
這是Android用戶端。輸入12345,點擊發送:
這是伺服器端收到的訊息