來自:http://www.imooc.com/learn/304
一個簡單的Android客戶端和服務器端傳送數據的例子,客戶端界面如下:
輸入兩個字符串name,age點擊register,在服務器端將我們輸入的內容打印出來。
1 服務器端
新建一個dynamic web project,工程名字:web,新建一個servlet,名稱:MyServlet。重寫doGet,doPost方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");//接收來自客戶端的參數
String age = request.getParameter("age");
/*PrintWriter: prints text data to a character stream
getWriter :Returns a PrintWriter object that can send character text to the client
*/
PrintWriter outPrintWriter = response.getWriter();
outPrintWriter.println("these paras will be sent to client: name = "+ name + ", age = " + age);
System.out.println("MyServlet:name = " + name);
System.out.println("MyServlet:age = " + age);
}
服務器端很簡單,就這麼多。
2 客戶端
2.1 新建佈局文件register.xml
<TableLayout 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"
android:stretchColumns="1">
<TableRow>
<TextView
android:id="@+id/tv_name"
android:layout_height="wrap_content"
android:text="name"/>
<EditText
android:id="@+id/edit_name"
android:layout_height="wrap_content"/>"
</TableRow>
<TableRow>
<TextView
android:id="@+id/tv_age"
android:layout_height="wrap_content"
android:text="age"/>
<EditText
android:id="@+id/edit_age"
android:layout_height="wrap_content"/>
</TableRow>
<TableRow>
<Button
android:id="@+id/btn_register"
android:layout_height="wrap_content"
android:text="register"
android:layout_span="2"/>
</TableRow>
</TableLayout>
2.1 新建對應的java類文件RegisterActivity.java
public class RegisterActivity extends Activity {
private EditText name;
private EditText age;
private Button register;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.register);
name = (EditText) findViewById(R.id.edit_name);
age = (EditText) findViewById(R.id.edit_age);
register = (Button) findViewById(R.id.btn_register);
register.setOnClickListener(new OnClickListener() {
String url = "http://223.2.45.232:8080/web/MyServlet";//這裏寫自己電腦的IP
@Override
public void onClick(View v) {
new HttpThread1(url, name.getText().toString(), age.getText().toString()).start();
}
});
}
}
2.2 新建一個HttpThread1.java繼承自Thread,將與服務器交互的代碼放在這裏。我們先使用get的方式訪問。
/*
* 在子線程中執行和服務器的交互操作
* */
public class HttpThread1 extends Thread {
private String url;
private String name;
private String age;
public HttpThread1(String url, String name, String age) {
this.url = url;
this.name = name;
this.age = age;
}
private void doGet()//使用get方式給服務器傳參數
{
try {
url = url + "?name=" + name + "&age=" + age;//通過get方式傳參數
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String str;
while ((str = reader.readLine()) != null) {
sb.append(str);
}
Log.d("HttpThread1", sb.toString());//將從服務器接收來的數據打印出來
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
doGet();
}
}
運行Android程序,輸入參數即可。
2.3 我們使用post的方式訪問服務器
在HttpThread1.java中新增一個doPost方法
private void doPost()//使用post方式給服務器傳參數
{
try {
URL httpUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
connection.setReadTimeout(5000);
connection.setRequestMethod("POST");
OutputStream outputStream = connection.getOutputStream();
String content = "name=" + name + "&age=" + age;
//將我們要發送的string數據轉化爲字節數組
outputStream.write(content.getBytes());//得到一個content的字節數組,返回該操作系統默認的編碼格式的字節數組
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String str;
while ((str = reader.readLine()) != null) {
sb.append(str);
}
Log.d("HttpThread1", sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
然後在run方法中調用即可。
3 以上代碼無法處理中文,當我們運行客戶端程序,傳入中文參數時就會出現亂碼,這種情況下我們只需要做一下編碼轉換即可。
3.1 修改MyServlet.java中的doPost方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");//接收來自客戶端的參數
String age = request.getParameter("age");
/*PrintWriter: prints text data to a character stream
getWriter :Returns a PrintWriter object that can send character text to the client
*/
response.setContentType("text/html;charset=utf-8");
PrintWriter outPrintWriter = response.getWriter();
//outPrintWriter.println("these params will be sent to client: name = "+ name + ", age = " + age);
outPrintWriter.println("these params will be sent to client: name = "+ new String(name.getBytes("ISO-8859-1"),"utf-8") + ", age = " + age); //將編碼轉爲utf-8
//System.out.println("MyServlet:name = " + name);
System.out.println("MyServlet:name = " + new String(name.getBytes("ISO-8859-1"),"utf-8"));//將編碼轉爲utf-8
System.out.println("MyServlet:age = " + age);
}
3.2 在HttpThread1.java中對doGet()方法中的url做編碼轉換,即
//如果要傳含有中文的name,需要將name轉換爲utf-8編碼
url = url + "?name=" + URLEncoder.encode(name, "utf-8") + "&age=" + age;//通過get方式傳參數
3.3 當使用post方式時就無需轉換編碼了,因爲Android系統本身的默認配置中提供了utf-8編碼的支持,因此不用修改HttpThread1.java中doPost()方法了。