此項目實現網絡通信,android手機客戶端去請求PC服務端,將PC上mysql中的數據顯示在手機上。
PC服務端用JavaWeb寫了個servlet,android手機客戶端請求這個servlet,由servlet執行查詢數據,並返回給手機客戶端,服務器爲Tomcat。
爲了更清楚的展示,咱們現在mysql建一個測試表test
- create table test(
- name varchar(20) primary key
- );
插入幾條記錄,我們這裏插入漢字,遇到亂碼,我們可以去解決。
- insert into test values('張三');
- insert into test values('李四');
- insert into test values('王五');
插入成功
閒話少說,直接上代碼:
PC服務端
我用MyEclipse建立了一個JavaWeb項目,這個項目中主要由一個數據查詢類DBManager.java和一個servlet(loadMessage.java)組成
DBManager.java
- package com.njue.DBManager;
- import java.awt.List;
- import java.sql.*;
- import java.util.ArrayList;
- import org.omg.CORBA.Object;
- public class DBManager {
- ;
- String userName="root";
- String password="123456";
- Connection conn=null;
- Statement stmt=null;
- String url="jdbc:mysql://localhost:3306/mysql";
- ArrayList<String> list=new ArrayList<String>();
- String sql;
- public DBManager(){
- sql="select * from test;";
- try {
- Class.forName("com.mysql.jdbc.Driver");
- conn=DriverManager.getConnection(url,userName,password);
- stmt=conn.createStatement();
- ResultSet rst=stmt.executeQuery(sql);
- while(rst.next()){
- //String name=new String(rst.getString("name").getBytes("latin1"), "UTF-8");
- String name=new String(rst.getString("name").getBytes("latin1"), "GB2312");// 這句可要可不要,以你不出現亂碼爲準
- //也可不用轉化,直接寫成String name=rst.getString("name");
- list.add(name);
- }
- rst.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public ArrayList<String> getList(){
- return list;
- }
- }
loadMessage.java
- package com.amaker.servlet;
- import java.awt.List;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.ArrayList;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.njue.DBManager.DBManager;
- public class loadMessage extends HttpServlet {
- public loadMessage() {
- super();
- }
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- // request.setCharacterEncoding("UTF-8");
- response.setContentType("text/html; charset=UTF-8" );
- PrintWriter out = response.getWriter();
- String message="";
- DBManager db=new DBManager();
- ArrayList<String> list=db.getList();
- for(int i=0;i<list.size();i++){
- message=message+list.get(i)+"\r\n";
- }
- out.print(message);
- out.flush();
- out.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- public void init() throws ServletException {
- // Put your code here
- }
- }
Android手機客戶端代碼:
AndroidClientActivity.java
- package com.njue.androidClient;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class AndroidClientActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- TextView tv=(TextView)findViewById(R.id.tv);
- // 查詢返回結果
- String result = HttpUtil.queryStringForPost("http://10.0.2.2:8080/androidWeb/servlet/loadMessage");
- //String result = HttpUtil.queryStringForPost("http://122.88.34.123:8080/androidWeb/servlet/loadMessage");
- tv.setText(result);
- }
- }
HttpUtil.java
- package com.njue.androidClient;
- import java.io.IOException;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.ClientProtocolException;
- 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.util.EntityUtils;
- public class HttpUtil {
- // 基礎URL
- // 獲得Get請求對象request
- public static HttpGet getHttpGet(String url){
- HttpGet request = new HttpGet(url);
- return request;
- }
- // 獲得Post請求對象request
- public static HttpPost getHttpPost(String url){
- HttpPost request = new HttpPost(url);
- return request;
- }
- // 根據請求獲得響應對象response
- public static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{
- HttpResponse response = new DefaultHttpClient().execute(request);
- return response;
- }
- // 根據請求獲得響應對象response
- public static HttpResponse getHttpResponse(HttpPost request) throws ClientProtocolException, IOException{
- HttpResponse response = new DefaultHttpClient().execute(request);
- return response;
- }
- // 發送Post請求,獲得響應查詢結果
- public static String queryStringForPost(String url){
- // 根據url獲得HttpPost對象
- HttpPost request = HttpUtil.getHttpPost(url);
- String result = null;
- try {
- // 獲得響應對象
- HttpResponse response = HttpUtil.getHttpResponse(request);
- // 判斷是否請求成功
- if(response.getStatusLine().getStatusCode()==200){
- // 獲得響應
- result = EntityUtils.toString(response.getEntity());
- //result=new String(result.getBytes("8859_1"),"GB2312"); 這句可要可不要,以你不出現亂碼爲準
- return result;
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- result = "網絡異常!";
- return result;
- } catch (IOException e) {
- e.printStackTrace();
- result = "網絡異常!";
- return result;
- }
- return null;
- }
- }
當然還得在AndroidManifest.xml中加入網絡訪問權限:
- <uses-permission android:name="android.permission.INTERNET"></uses-permission>
需要注意的寫服務器的主機號時,千萬不能寫localhost或者127.0.0.1,因爲Android模擬器雖然和服務端程序在同一臺電腦上,但兩個畢竟是獨立的系統,我們可以用10.0.2.2去訪問本機。
運行結果:
這是在模擬器上運行,有的同學有這樣的想法,把ip改成自己電腦真實的Ip,把客戶端拿到真機上去實驗,但運行後會發現會顯示“網絡異常”,不能訪問。這裏涉及到了網絡方面的問題,其實也非常簡單。下篇博客將會詳細的講解,去解決這個問題。
補充:上傳兩個項目,不禁可以訪問mysql,也可以訪問Access數據庫。