接上篇get方式,本文介绍post方式与服务器通信。调用两种类来实现post。

一个与get方法一样调用Url与HttpUrlConnection类,利用输入输出流方式,利用ObjectInputStream()函数进行**对象**读写。

另一个利用HttpPost(url)与HttpResponse类来实现。

先介绍第一种,对象写入后台一本书的信息,book类(定义很简单)。

android客户端:记得**设置**相应参数(post)

Book book = new Book();

book.setBookName("Android高级编程");

book.setAuthor("Reto Meier");

book.setPages(398);

book.setPrice(59.00);

URL url = null;

ObjectOutputStream oos = null;

try {

url = new URL("http://10.0.2.2:8080/ServerTest/TestServlet");

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setDoInput(true);

connection.setDoOutput(true);

connection.setConnectTimeout(10000);

connection.setReadTimeout(10000);

connection.setRequestMethod("POST");

oos = new ObjectOutputStream(connection.getOutputStream());

oos.writeObject(book);

InputStreamReader read = new InputStreamReader(connection.getInputStream());

BufferedReader br = new BufferedReader(read);

String line = br.readLine();

//String line = "";

//while ((line = br.readLine()) != null) {

// Log.d("TAG", "line is " + line);

//}//估计是为了确保读取全部信息

System.out.println("获得信息:"+line);

br.close();

connection.disconnect();

} catch (Exception e) {

System.out.println("错误信息:"+e.getMessage());

e.printStackTrace();

} finally {

}

服务器端:

public class TestServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

ObjectInputStream ois = null;

try {

ois = new ObjectInputStream(request.getInputStream());

Book book = (Book) ois.readObject();

System.out.println("书名是: " + book.getBookName());

System.out.println("作者是: " + book.getAuthor());

System.out.println("价格是: " + book.getPrice());

System.out.println("页数是: " + book.getPages());

PrintWriter out = response.getWriter();

//out.print("success");//客户端接受为“android”

out.write("success!");//客户端接受为“android!”很神奇吧~~

out.flush();

out.close();

} catch (Exception e) {

e.printStackTrace();

} finally {

ois.close();

}

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

}

}

方法一总结:基本跟java中的socket通信完全一样,前台两行代码,new url ,getConnection,然后操作输入输出流。后台利用response,request获得输入输出流。

第二种方式直接利用HttpPost类,不需再另外设置post方法。使用org.apache.http.*的一些类实现编码和参数设置。

try{

HttpPost request=new HttpPost(URL);

List params=new ArrayList();

params.add(new BasicNameValuePair("username","lg"));

params.add(new BasicNameValuePair("password","123"));

request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));

HttpResponse response=new DefaultHttpClient().execute(request);

String msg=EntityUtils.toString(response.getEntity());

System.out.println("返回消息:"+msg);

}catch(Exception e){

e.printStackTrace();

}

服务器端代码跟get方式的后台程序完成相同,只不过在doPost()方法实现。

方法二总结:利用NameValuePair类来设置类似java中map的方式来绑定键值数据,再利用Entity来设置实体传递对象。利用DefaultHttpClient类来实现联网操作,返回HttpResponse的数据体。

****************通信方式总结********** 这些天研究了socket和http通信的原理,发现正在联网传递的代码也就几行而已。socket中的输入输出流,web服务器端的request.getInputStream与response.getWriter操作。根据传输内容分简单字符串和类的实例等不同来调用不同的类。 实在是java关于网络传输的部分太不熟悉了,导致android通信部分学习的很慢。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐