使用Socket溝通

   當兩臺電腦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


而後創建一個Android項目,activity_main.xml 代碼 例如如下

<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>


MainActivity.java 代碼 例如如下

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();
	}
}

代碼其中192.168.0.104 爲本機的IP地址 查詢本機IP地址可以經過在開始中輸入 cmd 進入控制檯界面,而後輸入 IPconfig  按回車 就能夠獲得相關信息。

由於在本項目其中使用到了網絡通訊。所以必定要再AndroidManifest.xml其中配置訪問互聯網的權限。ide

<uses-permission android:name="android.permission.INTERNET"/>

從Android2.3之後的版本號中。Android平臺不一樣意直接在UI線程創建網絡鏈接。訪問網絡資源。

所以,有必要在新的線程與網絡相關的操做。用在本項目上的使用編碼

new Thread() 要建立一個新的線程。 控制新的線程UI該 EditText 控制顯示獲得的內容。.net

可是,通常狀況下。UI 在其餘線程的控制是不可操做。除ProgressBar 和EditText 外(如今我知道) 線程

相關文章
相關標籤/搜索