欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Android筆記 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

Android筆記

發(fā)表時(shí)間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):69


基于TCP協(xié)定的收集通信
應(yīng)用URL拜訪收集資本
應(yīng)用HTTP拜訪收集
應(yīng)用WebView視圖顯示網(wǎng)頁
 
 
 
基于TCP協(xié)定的收集通信
        TCP/IP通信協(xié)定是一種靠得住的收集協(xié)定,它在通信的兩端各建立一個(gè)Socket,通信的兩端之間形成收集虛擬鏈路。Java對基于TCP協(xié)定的收集通信供給了優(yōu)勝的封裝,Java應(yīng)用Socket對象來代表兩端的通信接口,并經(jīng)由過程Socket產(chǎn)生IO流來進(jìn)行收集通信。
1.1 應(yīng)用ServerSocket創(chuàng)建TCP辦事器端
       Java中能接收其他通信實(shí)體連接請求的類是ServerSocket, ServerSocket對象用于監(jiān)聽來自客戶端的Socket連接,如不雅沒有連接,它將一向處于等待狀況。 ServerSocket包含一個(gè)監(jiān)聽來自客戶端連接請求的辦法。
Socket accept():如不雅接收到一個(gè)客戶端Socket的連接請求,該辦法將返回一個(gè)與客戶端Socket對應(yīng)的Socket;不然該辦法將一向處于等待狀況,線程也被壅塞。 
 
為了創(chuàng)建ServerSocket對象,ServerSocket類供給了如下幾個(gè)構(gòu)造器:
       ServerSocket(int port):用指定的端口port來創(chuàng)建一個(gè)ServerSocket。該端口應(yīng)當(dāng)是有一個(gè)有效的端口整數(shù)值:0~65535。
       ServerSocket(int port,int backlog):增長一個(gè)用來改變連接隊(duì)列長度的參數(shù)backlog。
       ServerSocket(int port,int backlog,InetAddress localAddr):在機(jī)械存在多個(gè) IP地址的情況下,許可經(jīng)由過程localAddr這個(gè)參數(shù)來指定將ServerSocket綁定到指定的IP地址。
 
 當(dāng)ServerSocket應(yīng)用完畢,應(yīng)應(yīng)用ServerSocket的close()辦法來封閉該ServerSocket。
 
平日情況下,辦事器不該該只接收一個(gè)客戶端請求,而應(yīng)當(dāng)賡續(xù)地接收來自客戶端的所有請求,所以Java法度榜樣平日會(huì)經(jīng)由過程輪回,賡續(xù)地調(diào)用ServerSocket的accept()辦法。如下代碼片段所示:
[img]http://img.blog.csdn.net/20150105144328451
1.2 應(yīng)用Socket進(jìn)行通信
客戶端平日可應(yīng)用Socket的構(gòu)造器來連接到指定辦事器,Socket平日可應(yīng)用如下兩個(gè)構(gòu)造器:
       Socket(InetAddress/String remoteAddress, int port):創(chuàng)建連接到指定長途主機(jī)、長途端口的Socket。
       Socket(InetAddress/String remoteAddress, int port, InetAddress localAddr, int localPort):創(chuàng)建連接到指定長途主機(jī)、長途端口的Socket,并指定本地IP地址和本地端標(biāo)語。
膳綾擎兩個(gè)構(gòu)造器中指定長途主機(jī)時(shí)既可應(yīng)用InetAddress來指定,也可直接應(yīng)用String對象來指定,但法度榜樣平日應(yīng)用String對象(如127.0.0.1)來指定長途IP。
[img]http://img.blog.csdn.net/20150105144304359
以上代碼將會(huì)連接到指定辦事器,讓辦事器端的ServerSocket的accept()辦法向下履行。
當(dāng)客戶端、辦事器端產(chǎn)生了對應(yīng)的Socket之后,法度榜樣無須再區(qū)分辦事器、客戶端,而是經(jīng)由過程各自的Socket進(jìn)行通信,Socket供給如下兩個(gè)辦法來獲取輸入流和輸出流:
       InputStream getInputStream():返回該Socket對象對應(yīng)的輸入流,讓法度榜樣經(jīng)由過程該輸入流大年夜Socket中掏出數(shù)據(jù)。
       OutputStream getOutputStream():返回該Socket對象對應(yīng)的輸出流,讓法度榜樣經(jīng)由過程該輸出流向Socket中輸出數(shù)據(jù)。
例:簡單收集通信:
辦事器端法度榜樣代碼:
SimpleServer.java
public class SimpleServer
{
	public static void main(String[] args) 
		throws IOException
	{
		//創(chuàng)建一個(gè)ServerSocket,用于監(jiān)聽客戶端Socket的連接請求
		ServerSocket ss = new ServerSocket(30000);
		//采取輪回賡續(xù)接收來自客戶端的請求
		while (true)
		{
			//每當(dāng)接收到客戶端Socket的請求,辦事器端也對應(yīng)產(chǎn)生一個(gè)Socket
			Socket s = ss.accept();
			OutputStream os = s.getOutputStream();
			os.write("您好,您收到了辦事器的新年祝福!\n"
				.getBytes("utf-8"));
			//封閉輸出流,封閉Socket
			os.close();
			s.close();
		}
	}
}

 
客戶端法度榜樣:
SimpleClient.java
public class SimpleClient extends Activity
{
	EditText show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		//封閉輸入流、socket
		try
		{
			Socket socket = new Socket("127.0.0.1" , 30000);
			//將Socket對應(yīng)的輸入流包裝成BufferedReader
			BufferedReader br = new BufferedReader(
				new InputStreamReader(socket.getInputStream()));
			//進(jìn)行通俗IO操作
			String line = br.readLine();
			show.setText("來自辦事器的數(shù)據(jù):" + line);			
			br.close();
			socket.close();	
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
}

 
<!--  授權(quán)拜訪互聯(lián)網(wǎng)-->
	<uses-permission android:name="android.permission.INTERNET"/>

 
總結(jié)Socket通信,創(chuàng)建辦事器步調(diào):
       指定端話柄例化一個(gè)ServerSocket
       調(diào)用ServerSocket的accept()等待連接
       獲取位于該底層Socket的流以進(jìn)行讀寫操作
       對數(shù)據(jù)封裝成流
       對Socket進(jìn)行讀寫
       封閉打開的流
總結(jié)Socket通信,創(chuàng)建客戶端的步調(diào):
       經(jīng)由過程IP地址和端話柄例化Socket,請求連接辦事器
       獲取Socket上的流以進(jìn)行讀寫
       把流包裝進(jìn)BufferedReader/PrintWriter的實(shí)例
       對Socket進(jìn)行讀寫
       封閉打開的流
 
1.3  多線程
       實(shí)際應(yīng)用中的客戶端則可能須要和辦事器端保持長時(shí)光通信,即辦事器須要賡續(xù)地攫取客戶端數(shù)據(jù),并向客戶端寫入數(shù)據(jù);客戶端也須要賡續(xù)地攫取辦事器數(shù)據(jù),并向辦事器寫入數(shù)據(jù)。
       辦事器應(yīng)當(dāng)為每個(gè)Socket零丁啟動(dòng)一條線程,每條線程負(fù)責(zé)與一個(gè)客戶端進(jìn)行通信。 
       客戶端攫取辦事器數(shù)據(jù)的線程同樣會(huì)被壅塞,所以體系應(yīng)當(dāng)零丁啟動(dòng)一條線程,該線程專門負(fù)責(zé)攫取辦事器數(shù)據(jù)。
例:C/S聊天室法度榜樣:
辦事端法度榜樣:
MyServer.java
public class MyServer
{
	//定義保存所有Socket的ArrayList
	public static ArrayList<Socket> socketList 
		= new ArrayList<Socket>();
    public static void main(String[] args) 
		throws IOException
    {
        ServerSocket ss = new ServerSocket(30000);
		while(true)
		{
			//此行代碼會(huì)壅塞,將一向等待別人的連接
			Socket s = ss.accept();
			socketList.add(s);
			//每當(dāng)客戶端連接后啟動(dòng)一條ServerThread線程為該客戶端辦事
			new Thread(new ServerThread(s)).start();
		}
    }
}

 
ServerThread.java
//負(fù)糶ウ理每個(gè)線程通信的線程類
public class ServerThread implements Runnable 
{
	//定義當(dāng)前哨程所處理的Socket
	Socket s = null;
	//該線程所處理的Socket所對應(yīng)的輸入流
	BufferedReader br = null;
	public ServerThread(Socket s)
		throws IOException
	{
		this.s = s;
		//初始化該Socket對應(yīng)的輸入流
		br = new BufferedReader(new InputStreamReader(
			s.getInputStream() , "utf-8"));   //②
	}
	public void run()
	{
		try
		{
			String content = null;
			//采取輪回賡續(xù)大年夜Socket中攫取客戶端發(fā)送過來的數(shù)據(jù)
			while ((content = readFromClient()) != null)
			{
				//遍歷socketList中的每個(gè)Socket,
				//將讀到的內(nèi)容向每個(gè)Socket發(fā)送一次
				for (Socket s : MyServer.socketList)
				{
					OutputStream os = s.getOutputStream();
					os.write((content + "\n").getBytes("utf-8"));
				}
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}
	//定義攫取客戶端數(shù)據(jù)的辦法
	private String readFromClient()
	{
		try
		{
			return br.readLine();	
		}
		//如不雅捕獲到異常,注解該Socket對應(yīng)的客戶端已經(jīng)封閉
		catch (IOException e)
		{
			//刪除該Socket。
			MyServer.socketList.remove(s);    //①
		}
		return null;
	}
}

 
客戶端法度榜樣:
MultiThreadClient.java
public class MultiThreadClient extends Activity
{
	// 定義界面上的兩個(gè)文本框
	EditText input, show;
	// 定義界面上的一個(gè)按鈕
	Button send;
	OutputStream os;
	Handler handler;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		input = (EditText) findViewById(R.id.input);
		send = (Button) findViewById(R.id.send);
		show = (EditText) findViewById(R.id.show);
		Socket s;
		handler = new Handler()
		{
			@Override
			public void handleMessage(Message msg)
			{
				// 如不雅消息來自于子線程
				if (msg.what == 0x123)
				{
					// 將攫取的內(nèi)容追加顯示在文本框中
					show.append("\n" + msg.obj.toString());
				}
			}
		};
		try
		{
			s = new Socket("127.0.0.1", 30000);
			// 客戶端啟動(dòng)ClientThread線程賡續(xù)攫取來自辦事器的數(shù)據(jù)
			new Thread(new ClientThread(s, handler)).start(); // ①
			os = s.getOutputStream();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		send.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				try
				{
					// 將用戶在文本框內(nèi)輸入的內(nèi)容寫入收集
					os.write((input.getText().toString() + "\r\n")
						.getBytes("utf-8"));
					// 清空input文本框
					input.setText("");
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
	}
}

 
客戶端線程:
ClientThread.java
public class ClientThread implements Runnable
{
	//該線程負(fù)糶ウ理的Socket
	private Socket s;
	private Handler handler;
	//該線程所處理的Socket所對應(yīng)的輸入流
	BufferedReader br = null;
	public ClientThread(Socket s , Handler handler)
		throws IOException
	{
		this.s = s;
		this.handler = handler;
		br = new BufferedReader(
			new InputStreamReader(s.getInputStream()));
	}
	public void run()
	{
		try
		{
			String content = null;
			//賡續(xù)攫取Socket輸入流中的內(nèi)容。
			while ((content = br.readLine()) != null)
			{
				// 每當(dāng)讀到來自辦事器的數(shù)據(jù)之后,發(fā)送消息通知法度榜樣界面顯示該數(shù)據(jù)
				Message msg = new Message();
				msg.what = 0x123;
				msg.obj = content;
				handler.sendMessage(msg);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

 
應(yīng)用URL拜訪收集資本
       URL對象代表同一資本定位器,它是指向互聯(lián)網(wǎng)”資本”的指針,資本可所以簡單的文件或目次,也可所以對更復(fù)雜的對象的引用,URL可由協(xié)定名、主機(jī)、端口和資本構(gòu)成 。
URL類供給了多個(gè)構(gòu)造器用于創(chuàng)建URL對象,一旦獲得了URL對象之后,可聲調(diào)用如下常用辦法來拜訪該URL對應(yīng)的資本。
       String getFile():獲取此URL的資本名
       String getHost():獲取此URL的主機(jī)名
       String getPath():獲取些URL的路徑部分
       int getPort():獲取此URL的端標(biāo)語
       String getProtocol():獲取此URL的協(xié)定名稱
       String getQuery():獲取此URL的萌芽字符串部分
       URLConnection openConnection():URL所引用長途對象連接
       InputStream openStream():打開與些URL的連接,并返回一個(gè)用于攫取該URL資本的InputStream。
例:應(yīng)用URL攫取收集資本:
URLTest.java
public class URLTest extends Activity
{
	ImageView show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (ImageView) findViewById(R.id.show);
		// 定義一個(gè)URL對象
		try
		{
			URL url = new URL("http://www.xxx.com/photo.png");
			// 打開該URL對應(yīng)的資本的輸入流
			InputStream is = url.openStream();
			// 大年夜InputStream中解析出圖片
			Bitmap bitmap = BitmapFactory.decodeStream(is);
			// 應(yīng)用ImageView顯示該圖片
			show.setImageBitmap(bitmap);
			is.close();
			// 再次打開URL對應(yīng)的資本的輸入流
			is = url.openStream();
			// 打開手機(jī)文件對應(yīng)的輸出流
			OutputStream os = openFileOutput("crazyit.png"
				, MODE_WORLD_READABLE);
			byte[] buff = new byte[1024];
			int hasRead = 0;
			// 將URL對應(yīng)的資本下載到本地
			while((hasRead = is.read(buff)) > 0)
			{
				os.write(buff, 0 , hasRead);
			}
			is.close();
			os.close();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

 
2.1 應(yīng)用URLConnection提交請求 
平日創(chuàng)建一個(gè)和URL的連接,并發(fā)送請求。攫取此URL引用的資本須要如下幾個(gè)步調(diào) :
       經(jīng)由過程調(diào)用Url對象openConnection()辦法創(chuàng)建URLConnection對象。
       設(shè)置URLConnection的參數(shù)和通俗請求屬性。
如不雅只是發(fā)送get方法請求,應(yīng)用Connect辦法建立和長途資本之間的實(shí)際連接即可;如不雅須要發(fā)送post方法的請求須要獲取URlConnection實(shí)例對應(yīng)的輸出流來發(fā)送請求參數(shù)。
長途資本變?yōu)榭捎?,法度榜樣可以拜訪長途資本的頭字段或經(jīng)由過程輸入流攫取長途資本的數(shù)據(jù)。 
在建立和長途資本的實(shí)際連接之前,可以經(jīng)由過程如下辦法來設(shè)置請求頭字段。
       setAllowUserInteraction:設(shè)置該URLConnection的allowUserInteraction請求頭字段的值。
       setDoInput:設(shè)置該URLConnection的doInput請求頭字段的值。
       setDoOutput:設(shè)置該URLConnection的doOutput請求頭字段的值。
       setIfModifiedSince:設(shè)置該URLConnection的ifModifiedSince請求頭字段的值。
       setUseCaches:設(shè)置該URLConnection的useCaches請求頭字段的值
還可以應(yīng)用如下辦法來設(shè)置或增長通用頭字段。
       setRequestProperty(String key,String value):設(shè)置該URLConnection的key請求頭字段的值為value。
       addRequestProperty(String key,String value):為該URLConnection的key請求頭字段增長value值。
當(dāng)長途資本可用時(shí),法度榜樣可以應(yīng)用以下辦法用于拜訪頭字段和內(nèi)容。
       Object getContent():獲取該URLConnection的內(nèi)容
       String getHeaderField(String name):獲取指定響應(yīng)頭字段的值
       getInputStream():返回該URLConnection對應(yīng)的輸入流,用于獲取URLConnection響應(yīng)的內(nèi)容。
       getOutputStream():返回該URLConnection對應(yīng)的輸出流,用于向URLConnection發(fā)送請求參數(shù)。
例:向Web站點(diǎn)發(fā)送GET、POST請求:
GetPostMain.java
public class GetPostMain extends Activity
{
	Button get , post;
	EditText show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		get = (Button) findViewById(R.id.get);
		post = (Button) findViewById(R.id.post);
		show = (EditText)findViewById(R.id.show);
		get.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				String response = GetPostUtil
					.sendGet("http://127.0.0.1:8080/abc/a.jsp" , null);
				show.setText(response);
				
			}			
		});
		post.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				String response = GetPostUtil
					.sendPost("http://127.0.0.1:8080/abc/login.jsp"
					, "name=xxx&pass=123");
				show.setText(response);
				
			}			
		});	
	}
}

 
GetPostUtil.java
public class GetPostUtil
{
	/**
	 * 向指定URL發(fā)送GET辦法的請求
	 * 
	 * @param url
	 *            發(fā)送請求的URL
	 * @param params
	 *            請求參數(shù),請求參數(shù)應(yīng)當(dāng)是name1=value1&name2=value2的情勢。
	 * @return URL所代表長途資本的響應(yīng)
	 */
	public static String sendGet(String url, String params)
	{
		String result = "";
		BufferedReader in = null;
		try
		{
			String urlName = url + "?" + params;
			URL realUrl = new URL(urlName);
			// 打開和URL之間的連接
			URLConnection conn = realUrl.openConnection();
			// 設(shè)置通用的請求屬性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent",
				"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
			// 建立實(shí)際的連接
			conn.connect();
			// 獲取所有響應(yīng)頭字段
			Map<String, List<String>> map = conn.getHeaderFields();
			// 遍歷所有的響應(yīng)頭字段
			for (String key : map.keySet())
			{
				System.out.println(key + "--->" + map.get(key));
			}
			// 定義BufferedReader輸入流來攫取URL的響應(yīng)
			in = new BufferedReader(
				new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null)
			{
				result += "\n" + line;
			}
		}
		catch (Exception e)
		{
			System.out.println("發(fā)送GET請求出現(xiàn)異常!" + e);
			e.printStackTrace();
		}
		// 應(yīng)用finally塊來封閉輸入流
		finally
		{
			try
			{
				if (in != null)
				{
					in.close();
				}
			}
			catch (IOException ex)
			{
				ex.printStackTrace();
			}
		}
		return result;
	}

	/**
	 * 向指定URL發(fā)送POST辦法的請求
	 * 
	 * @param url
	 *            發(fā)送請求的URL
	 * @param params
	 *            請求參數(shù),請求參數(shù)應(yīng)當(dāng)是name1=value1&name2=value2的情勢。
	 * @return URL所代表長途資本的響應(yīng)
	 */
	public static String sendPost(String url, String params)
	{
		PrintWriter out = null;
		BufferedReader in = null;
		String result = "";
		try
		{
			URL realUrl = new URL(url);
			// 打開和URL之間的連接
			URLConnection conn = realUrl.openConnection();
			// 設(shè)置通用的請求屬性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent",
				"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
			// 發(fā)送POST請求必須設(shè)置如下兩行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 獲取URLConnection對象對應(yīng)的輸出流
			out = new PrintWriter(conn.getOutputStream());
			// 發(fā)送請求參數(shù)
			out.print(params);
			// flush輸出流的緩沖
			out.flush();
			// 定義BufferedReader輸入流來攫取URL的響應(yīng)
			in = new BufferedReader(
				new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = in.readLine()) != null)
			{
				result += "\n" + line;
			}
		}
		catch (Exception e)
		{
			System.out.println("發(fā)送POST請求出現(xiàn)異常!" + e);
			e.printStackTrace();
		}
		// 應(yīng)用finally塊來封閉輸出流、輸入流
		finally
		{
			try
			{
				if (out != null)
				{
					out.close();
				}
				if (in != null)
				{
					in.close();
				}
			}
			catch (IOException ex)
			{
				ex.printStackTrace();
			}
		}
		return result;
	}
}

 
應(yīng)用HTTP拜訪收集
3.1 應(yīng)用HttpURLConnection
URLConnection還有一個(gè)子類:HttpURLConnection,可以用于向指定網(wǎng)站發(fā)送GET請求、POST請求。它在URLConnection的基本上供給了如下辦法:
       int getResponseCode():獲取辦事器的響應(yīng)代碼
       String getResponseMessage():獲取辦事器的響應(yīng)信息
       String getRequestMethod():獲取發(fā)送請求的辦法
       Void setRequestMethod(String method):設(shè)置發(fā)送請求的辦法
例:多線程下載:
為了實(shí)現(xiàn)多線程,法度榜樣可按如下步調(diào)進(jìn)行:
       創(chuàng)建URL對象
       獲取指定URL對象所指象的資本大年夜?。ㄓ蒰etContentLength()辦法實(shí)現(xiàn)),此處用到了HttpURLConnection類。
       在本地磁盤上創(chuàng)建一個(gè)與收集資本雷同大年夜小的空文件
       計(jì)算每條線程應(yīng)當(dāng)下載收集資本的哪個(gè)部分
       依次創(chuàng)建、啟動(dòng)多條線程來下載收集資本的指定部分。
 
3.2 應(yīng)用Apache HttpClient
       HttpClient是一個(gè)加強(qiáng)版的HttpURLConnection,它是一個(gè)簡單的客戶端(并不是瀏覽器),可以發(fā)送HTTP請求,接收HTTP響應(yīng),以及治理HTTP連接。但不會(huì)緩存辦事器的響應(yīng),不克不及履行HTML頁面中嵌入的JavaScript代碼,也不會(huì)對頁面內(nèi)容進(jìn)行任何解析、處理。
Android已經(jīng)成功地集成了HttpClient,可以直接在Android應(yīng)用中應(yīng)用HttpClient來拜訪提交請求、接收響應(yīng)。應(yīng)用HttpClient的步調(diào)如下:
       創(chuàng)建HttpClient對象
       如不雅須要發(fā)送GET請求,創(chuàng)建HttpGet對象,如不雅須要發(fā)送POST請求,創(chuàng)建HttpPost對象。
       如不雅須要發(fā)送請求參數(shù),可調(diào)用HttpGet、HttpPost合營的setParams(HttpParams params)辦法來添加請求參數(shù)。
       調(diào)用HttpClient對象的execute(HttpUriRequest request)發(fā)送請求,該辦法返回一個(gè)HttpResponse。
       調(diào)用HttpResponse的getAllHeader()、getHeaders(String name)等辦法可獲取辦事器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()辦法可獲取HttpEntity對象,該對象包含了辦事器的響應(yīng)內(nèi)容。法度榜樣可經(jīng)由過程該對象獲取辦事器的響應(yīng)內(nèi)容。
例:HttpClient拜訪被保護(hù)的資本:
HttpClientTest.java
public class HttpClientTest extends Activity
{
	Button get;
	Button login;
	EditText response;
	HttpClient httpClient;

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 創(chuàng)建DefaultHttpClient對象
		httpClient = new DefaultHttpClient();
		get = (Button) findViewById(R.id.get);
		login = (Button) findViewById(R.id.login);
		response = (EditText) findViewById(R.id.response);
		get.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// 創(chuàng)建一個(gè)HttpGet對象
				HttpGet get = new HttpGet(
					"http://127.0.0.1:8080/foo/secret.jsp");
				try
				{
					// 發(fā)送GET請求
					HttpResponse httpResponse = httpClient.execute(get);
					HttpEntity entity = httpResponse.getEntity();
					if (entity != null)
					{
						// 攫取辦事器響應(yīng)
						BufferedReader br = new BufferedReader(
							new InputStreamReader(entity.getContent()));
						String line = null;
						response.setText("");
						while ((line = br.readLine()) != null)
						{
							// 應(yīng)用response文本框顯示辦事器響應(yīng)
							response.append(line + "\n");
						}
					}
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}
		});
		login.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				final View loginDialog = getLayoutInflater().inflate(
					R.layout.login, null);
				new AlertDialog.Builder(HttpClientTest.this)
					.setTitle("登錄體系")
					.setView(loginDialog)
					.setPositiveButton("登錄",
						new DialogInterface.OnClickListener()
						{
							@Override
							public void onClick(DialogInterface dialog,
								int which)
							{
								String name = ((EditText) loginDialog
									.findViewById(R.id.name)).getText()
									.toString();
								String pass = ((EditText) loginDialog
									.findViewById(R.id.pass)).getText()
									.toString();
								HttpPost post = new HttpPost(
									"http://127.0.0.1:8080/foo/login.jsp");
								// 如不雅傳遞參數(shù)個(gè)數(shù)比較多的話可以對傳遞的參數(shù)進(jìn)行封裝
								List<NameValuePair> params = new ArrayList<NameValuePair>();
								params
									.add(new BasicNameValuePair("name", name));
								params
									.add(new BasicNameValuePair("pass", pass));
								try
								{
									// 設(shè)置請求參數(shù)
									post.setEntity(new UrlEncodedFormEntity(
										params, HTTP.UTF_8));
									// 發(fā)送POST請求
									HttpResponse response = httpClient
										.execute(post);
									// 如不雅辦事器成功地返回響應(yīng)
									if (response.getStatusLine()
										.getStatusCode() == 200)
									{
										String msg = EntityUtils
											.toString(response.getEntity());
										// 提示登錄成功
										Toast.makeText(HttpClientTest.this,
											msg, 5000).show();
									}
								}
								catch (Exception e)
								{
									e.printStackTrace();
								}
							}
						}).setNegativeButton("撤消", null).show();
			}
		});
	}
}

 
應(yīng)用WebView視圖顯示網(wǎng)頁
4.1 應(yīng)用WebView瀏覽網(wǎng)頁
WebView的用法與通俗的ImageView組件的用法基本相似,它供給了大年夜量辦法來履行瀏覽器操作,例如如下常用辦法。
       void goBack():撤退撤退
       void goForward():進(jìn)步
       void loadUrl(String url):加載指定的URL對應(yīng)的網(wǎng)頁
       boolean zoomIn():放大年夜網(wǎng)頁
       boolean zoomOut():縮小網(wǎng)頁
例:迷你瀏覽器:
MiniBrowser.java
public class MiniBrowser extends Activity
{
	EditText url;
	WebView show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取頁面中文本框、WebView組件
		url = (EditText) findViewById(R.id.url);
		show = (WebView) findViewById(R.id.show);
	}
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event)
	{
		if (keyCode == KeyEvent.KEYCODE_SEARCH)
		{
			String urlStr = url.getText().toString();
			// 加載、并顯示urlStr對應(yīng)的網(wǎng)頁
			show.loadUrl(urlStr);
			return true;
		}
		return false;
	}
}

 
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/url"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <!-- 顯示頁面的WebView組件 -->

    <WebView
        android:id="@+id/show"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</LinearLayout>

4.2 應(yīng)用WebView加載HTML代碼
       應(yīng)用WebView可以對HTML字符串進(jìn)行解析、當(dāng)成HTML頁面來顯示。 WebView供給了一個(gè)loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)辦法,該辦法是對loadData(String data, data,String mimeType,String encoding)辦法的加強(qiáng),它不會(huì)產(chǎn)生亂碼。
 
例:應(yīng)用WebView加載HTML:
在設(shè)備文件中加上拜訪收集的權(quán)限
[img]http://img.blog.csdn.net/20150105144337671
ViewHtml.java
public class ViewHtml extends Activity
{
	WebView show;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// 獲取法度榜樣中的WebView組件
		show = (WebView) findViewById(R.id.show);
		StringBuilder sb = new StringBuilder();
		// 拼接一段HTML代碼
		sb.append("<html>");
		sb.append("<head>");
		sb.append("<title> 迎接您 </title>");
		sb.append("</head>");
		sb.append("<body>");
		sb.append("<h2> 迎接您拜訪<a href=http://www.sjsjw.com/"http://http://blog.csdn.net/">"
			+ "CSDN");
		sb.append("");
		sb.append("");
		// 應(yīng)用簡單的loadData辦法會(huì)導(dǎo)致亂碼,可能是Android API的Bug
		//show.loadData(sb.toString() , "text/html" , "utf-8");
		// 加載、并顯示HTML代碼
		show.loadDataWithBaseURL(null, sb.toString()
			, "text/html" , "utf-8", null);
	}
}

 
 
 
 
 
 
 
 
 
 
 

相關(guān)案例查看更多