【Android知识点精讲】(10)网络编程
2014-12-29 21:24
405 查看
文章出处:/article/1876442.html
1. 创建HttpGet或HttpPost对象,将请求的URL通过构造方法传入HttpGet或HttpPost对象。
2. 使用DefaultHttpClient.execute方法发送HTTPGET或HTTPPOST请求,并返回HttpResponse对象。
3. 通过HttpResponse接口的getEntity方法返回响应信息,并进行响应的处理。
如果使用HttpPost方法提交HTTPPOST请求,还需要使用HttpPost类的setEntity方法设置请求参数。
下面看一个使用列子:
1. 用Url.openConnection方法获取HttpURLConnection对象。
2. 设置请求方法,如httpURLConnection.setRequestMethod("POST"); (这里注意使用大写的POST或者GET)
3. 设置输入输出及其它权限。
4. 设置HTTP请求头。
5. 输入和输出数据
6. 关闭输入输出流。
上例子:
Socket发送数据:
服务监听客户端请求:
源码下载
一 HttpGet和HttpPost
HttpGet和HttpPost使用步骤:1. 创建HttpGet或HttpPost对象,将请求的URL通过构造方法传入HttpGet或HttpPost对象。
2. 使用DefaultHttpClient.execute方法发送HTTPGET或HTTPPOST请求,并返回HttpResponse对象。
3. 通过HttpResponse接口的getEntity方法返回响应信息,并进行响应的处理。
如果使用HttpPost方法提交HTTPPOST请求,还需要使用HttpPost类的setEntity方法设置请求参数。
下面看一个使用列子:
package cn.eoe.http.get.post; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Main extends Activity implements OnClickListener { private EditText etBookName; @Override public void onClick(View view) { String url = "http://192.168.17.105:8080/querybooks/QueryServlet"; TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult); HttpResponse httpResponse = null; try { switch (view.getId()) { // 提交HTTP GET请求 case R.id.btnGetQuery: // 向url添加请求参数 url += "?bookname=" + etBookName.getText().toString(); // 第1步:创建HttpGet对象 HttpGet httpGet = new HttpGet(url); // 第2步:使用execute方法发送HTTP GET请求,并返回HttpResponse对象 httpResponse = new DefaultHttpClient().execute(httpGet); // 判断请求响应状态码,状态码为200表示服务端成功响应了客户端的请求 if (httpResponse.getStatusLine().getStatusCode() == 200) { // 第3步:使用getEntity方法获得返回结果 String result = EntityUtils.toString(httpResponse .getEntity()); // 去掉返回结果中的“\r”字符,否则会在结果字符串后面显示一个小方格 tvQueryResult.setText(result.replaceAll("\r", "")); } break; // 提交HTTP POST请求 case R.id.btnPostQuery: // 第1步:创建HttpPost对象 HttpPost httpPost = new HttpPost(url); // 设置HTTP POST请求参数必须用NameValuePair对象 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("bookname", etBookName .getText().toString())); // 设置HTTP POST请求参数 httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 第2步:使用execute方法发送HTTP POST请求,并返回HttpResponse对象 httpResponse = new DefaultHttpClient().execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 第3步:使用getEntity方法获得返回结果 String result = EntityUtils.toString(httpResponse .getEntity()); // 去掉返回结果中的“\r”字符,否则会在结果字符串后面显示一个小方格 tvQueryResult.setText(result.replaceAll("\r", "")); } break; } } catch (Exception e) { tvQueryResult.setText(e.getMessage()); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnGetQuery = (Button) findViewById(R.id.btnGetQuery); Button btnPostQuery = (Button) findViewById(R.id.btnPostQuery); etBookName = (EditText) findViewById(R.id.etBookName); etBookName.setText("开发"); btnGetQuery.setOnClickListener(this); btnPostQuery.setOnClickListener(this); } }需要注意的是,在Android手机上必须使用具体的IP地址,不能使用127.0.0.1,这样会运行不到预想的结果。其它注释写的很清楚,怎么使用也很好理解。
二 HttpURLConnection
HttpURLConnection使用步骤:1. 用Url.openConnection方法获取HttpURLConnection对象。
2. 设置请求方法,如httpURLConnection.setRequestMethod("POST"); (这里注意使用大写的POST或者GET)
3. 设置输入输出及其它权限。
4. 设置HTTP请求头。
5. 输入和输出数据
6. 关闭输入输出流。
上例子:
package com.thr.upload.file; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.URL; import com.thr.upload.file.R; import com.thr.widget.file.browser.FileBrowser; import com.thr.widget.file.browser.OnFileBrowserListener; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.Toast; public class Main extends Activity implements OnFileBrowserListener { @Override public void onDirItemClick(String path) { } @Override public void onFileItemClick(String filename) { String uploadUrl = "http://192.168.17.105:8080/upload/UploadServlet"; String end = "\r\n"; String twoHyphens = "--"; String boundary = "******"; try { URL url = new URL(uploadUrl); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); httpURLConnection.setUseCaches(false); httpURLConnection.setRequestMethod("POST"); httpURLConnection.setRequestProperty("Connection", "Keep-Alive"); httpURLConnection.setRequestProperty("Charset", "UTF-8"); httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream( httpURLConnection.getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filename.substring(filename.lastIndexOf("/") + 1) + "\"" + end); dos.writeBytes(end); FileInputStream fis = new FileInputStream(filename); byte[] buffer = new byte[8192]; // 8k int count = 0; while ((count = fis.read(buffer)) != -1) { dos.write(buffer, 0, count); } fis.close(); dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); InputStream is = httpURLConnection.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "utf-8"); BufferedReader br = new BufferedReader(isr); String result = br.readLine(); Toast.makeText(this, result, Toast.LENGTH_LONG).show(); dos.close(); is.close(); } catch (Exception e) { setTitle(e.getMessage()); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); FileBrowser fileBrowser = (FileBrowser) findViewById(R.id.filebrowser); fileBrowser.setOnFileBrowserListener(this); } }这里我们定义了2个字符来区分文件传输中的边界。使用httpURLConnection.setDoInput和httpURLConnection.setDoOutput方法来设置是否允许输入和输出流。最后使用一次8k的大小向服务器中上传数据。并将服务器返回值以Toast形式展现出来。
三 Socket
Android中Socket的使用和Java中的使用是一样的。Socket发送数据:
try { Socket socket = new Socket("192.168.1.226", 9527); OutputStream os = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); bw.write("Hello"); bw.flush(); bw.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }Socket接收数据:
try { Socket socket = new Socket("192.168.1.226", 9527); InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String s = ""; while ((s = br.readLine()) != null) { System.out.println(s); } br.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
服务监听客户端请求:
ServerSocket serverSocket; try { serverSocket = new ServerSocket(9527); // 处理其他任务 while (true) { Socket socket = serverSocket.accept(); // 等待接受客户端消息 // 处理其他任务 new Thread().start(); } } catch (IOException e) { e.printStackTrace(); }
源码下载
相关文章推荐
- Android 的网络编程(10)-网络权限配置
- android之旅10 网络编程2: HttpClient与github的封装
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
- Android网络编程之Http通信 推荐
- Android网络编程实践之旅(二):基于Socket的网络通信
- android HttpURLConnection编程详解,获取网络图片,html代码查
- Android 的网络编程
- Java网络编程从入门到精通(10):Inet4Address类和Inet6Address类
- Android网络编程实践之旅(一):网络状态检测
- Android 的网络编程
- 云平台编程与开发(五):开发Android网络游戏的一点探讨
- Android网络编程之WebKit应用 推荐
- Android网络编程之通过Post传递参数
- Android网络编程之Http通信
- 黑马程序员Java培训和Android培训_网络编程
- 网络编程[10]
- Android学习11Android上的网络编程
- android之socket网络编程
- android通过webservice进行网络编程实例
- Android网络编程