當兩臺電腦TCP/IP協議進行通信。平時Socket對象來表示該通訊接口的兩端,並經過Socket生產I/O流進行網絡通訊。html
其中ServerSocket對象能夠接收從鏈接的其餘通訊實體的請求。這個目的是用於偵聽client的Socket鏈接。假設沒有鏈接,它將一直處於等待狀態。java
在本文中將建立一個server端的ServerSocket 和 手機client的Socket . 使它們創建鏈接。產生I/O流,在手機上顯示獲取的數據。android
終於獲得的結果例如如下圖所看到的。網絡
首先建一個Java項目。用來建立ServerSocket. 代碼例如如下app
import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class SimpleServer { public static void main(String[] args) throws IOException { //建立一個ServerSocket,用於監聽clientSocket的鏈接請求 ServerSocket ss = new ServerSocket(30000); System.out.println("server端已準備接受請求"); //使用循環不斷接收來自client的請求 while(true){ //每當接收到一個clientSocket的請求。server端也會相應產生一個Socket對象 Socket s = ss.accept(); OutputStream os = s.getOutputStream(); //輸出字符串。並強行使用UTF-8字符集進行編碼 os.write("您好。您收到了server的新年祝福!\n".getBytes("utf-8")); //關閉輸出流,關閉Socket os.close(); s.close(); } } } socket
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${packageName}.${activityClass}" > <EditText android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
package com.wyb.simpleclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.os.Bundle; import android.widget.EditText; public class MainActivity extends Activity { private EditText show; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show = (EditText)findViewById(R.id.show); ///建立一個新線程來進行網絡操做 new Thread(){ @Override public void run() { try { //創建鏈接到遠程server的Socket Socket socket = new Socket("192.168.0.104",30000); //將Socket相應的輸入流包裝成BufferedReader BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); //進行普通的I/O操做 String line = br.readLine(); //在該線程中控制UI中的EditText控件顯示內容 show.setText("來自server的數據: "+ line); //關閉流、socket br.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
由於在本項目其中使用到了網絡通訊。所以必定要再AndroidManifest.xml其中配置訪問互聯網的權限。ide
<uses-permission android:name="android.permission.INTERNET"/>
所以,有必要在新的線程與網絡相關的操做。用在本項目上的使用編碼
new Thread() 要建立一個新的線程。 控制新的線程UI該 EditText 控制顯示獲得的內容。.net
可是,通常狀況下。UI 在其餘線程的控制是不可操做。除ProgressBar 和EditText 外(如今我知道) 線程