Android作為用戶端,PC作為服務端:實現網路通訊

來源:互聯網
上載者:User

此項目實現網路通訊,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 blocke.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請求對象requestpublic static HttpGet getHttpGet(String url){HttpGet request = new HttpGet(url); return request;}// 獲得Post請求對象requestpublic static HttpPost getHttpPost(String url){ HttpPost request = new HttpPost(url); return request;}// 根據請求獲得響應對象responsepublic static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{HttpResponse response = new DefaultHttpClient().execute(request);return response;}// 根據請求獲得響應對象responsepublic 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資料庫。

http://download.csdn.net/detail/pzhtpf/4388157

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.