来自: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()方法了。