2016-03-23 168 views
0

我正在研究需要連接到位於同一網絡中另一臺計算機上的本地主機的Android應用程序。我沒有問題通過另一臺計算機連接到本地主機,但我如何通過android連接到本地主機?我正在使用android studio,並通過wamp使用MySql和php腳本創建了數據庫。將Android連接到Wamp服務器

+0

您需要發送NetworkRequest爲localhost。使用HttpsURLConnection(http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection。HTML),並確保您的Android設備和服務器連接到相同的網絡/無線 –

+0

您還可以使用第三方庫,如AndroidVolley(只是谷歌的教程)這是一個網絡庫,它可以幫助您發送和從服務器接收數據 –

回答

0

你必須把你的服務器放在網絡中。之後,您可以使用電腦的IpAdress進行訪問。 我從來沒有這樣做過Wamp服務器。

How to enable local network users to access my WAMP sites?

要連接您的Android手機,你可以使用HttpURLConnection類:http://developer.android.com/reference/java/net/HttpURLConnection.html

如果你想顯示你的網頁,你可以使用的WebView:http://developer.android.com/reference/android/webkit/WebView.html


這裏是我的類連接到服務器。 我在構造函數中加入了一個Listner。監聽器是一個實現接口的類。有了這個,你可以重寫接口的方法,當異步任務完成時(onPostExecute中的listner.onTaskCompleted),方法就是調用。

package controller; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.pm.ActivityInfo; 
import android.os.AsyncTask; 
import android.util.Log; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import javax.net.ssl.HttpsURLConnection; 

/** 
* Created by mwissle on 26/02/2016. 
* Class permettant de récupérer le JSON depuis internet 
*/ 
public class YourClassForConnection extends AsyncTask<String, String, String> { 

    private AsyncResponse listener; 
    HttpURLConnection conn = null; //New object HttpURLConnection 



    public YourClassForConnection(AsyncResponse listener){ 
     this.listener=listener; 
    } 

    protected void onPreExecute() { 
     progress = new ProgressDialog(activity); 
    } 


    @Override 
    protected String doInBackground(String... params) { 

     String response = ""; 
     String responseError = ""; 

     try{ 
      //Connect to URL 
      Log.d("JSON", "Start of connexion"); 
      URL url = new URL(params[0]); 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(15000); 
      conn.setConnectTimeout(15000); 
      conn.connect(); 

      int responseCode=conn.getResponseCode(); 

      //HTTP_OK --> 200 
      //HTTP_CONFLICT --> 409 
      if (responseCode == HttpsURLConnection.HTTP_OK) { 
       String line; 
       BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       while ((line=br.readLine()) != null) { 
        response+=line; 
       } 
       return response; 
      } 
      else if(responseCode == HttpURLConnection.HTTP_CONFLICT){ 
       String line; 
       BufferedReader br=new BufferedReader(new InputStreamReader(conn.getErrorStream())); 
       while ((line=br.readLine()) != null) { 
        responseError+=line; 
       } 
       return responseError; 
      } 
      else { 
       return null; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (conn != null){ 
       conn.disconnect(); 
      } 

     } 

      return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try{ 
      super.onPostExecute(result); 
      listener.onTaskCompleted(result); 
     } 
     catch(NullPointerException npe){ 
      Log.d("NullPointerException", npe.getMessage()); 
     } 
    } 
} 
+0

嘿。我已經把服務器放到了網絡中。我可以訪問網絡中的服務器。 應該在android中給出什麼代碼,以便應用程序也可以連接到服務器? –

+0

你想做什麼?你想顯示WebPage或調用Url的一些參數? – Eraseth

+0

是否有可能在android代碼中使用url連接到我們的數據庫? –

0

「本地主機」地址總是隻指向您要從中調用它的設備。

示例:如果您從您的電腦中調用/導航到「localhost」,它將返回從您的電腦提供的內容。如果你在你的android設備上做同樣的事情,它會返回你從android設備提供的內容。

從我的理解你的問題是,你想從Android設備上的應用程序訪問你的wamp服務器。 這樣做,你應該從你的android應用程序的網絡請求到你的計算機的IP地址(而不是「localhost」),即運行一個wamp服務器。 您可以通過在cmd(windows)中調用「ipconfig」或在終端(linux)中調用「ifconfig」來獲取計算機的IP。

在你的應用程序中,你應該使用Http(s)URLConnection,你需要在非UI線程中使用它,所以它不會崩潰你的應用程序。你可以使用AsyncTask。

下面是該示例代碼:

public class DBqueryS extends AsyncTask<String,String,String>{ 

    final Handler mHandler; 

    private static String urlLink = ""; 

    public DBqueryS(Handler handler) { 
     urlLink = "YOUR_SERVER_ADDRESS"; 
     mHandler = handler; //Handler from UI activity that will receive the request response when it arrives 
     Log.i("DBquery", "" + action); 
    } 

    @Override 
    protected String doInBackground(String... strings) { 
     //get execution parameters from strings 
     return postText(); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //Do something before "doInBackground()" 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     //Do something after "doInBackground()" 
     mHandler.obtainMessage(HTTP_REQUEST_COMPLETE,s).sendToTarget(); 
    } 

    private String postText(){ 
     try{ 
      // add request data 
      List<NameValuePair> nameValuePairs = new ArrayList<>(0); 
      nameValuePairs.add(new BasicNameValuePair("key",value)); 

      Log.i("DBquery sent", nameValuePairs.toString()); 

      // HttpClient 
      URL url = new URL(urlLink); 
      HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 
      connection.setReadTimeout(5000 /* milliseconds */); 
      connection.setConnectTimeout(3000 /* milliseconds */); 
      connection.setRequestMethod("POST"); //Can be GET,... 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      // attach data 
      OutputStream os = connection.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os,"UTF-8")); 
      writer.write(getQuery(nameValuePairs)); 
      writer.flush(); 
      writer.close(); 
      os.close(); 

      // execute HTTP post request 
      connection.connect(); 

      // read response 
      int responseCode = connection.getResponseCode(); 
      Log.i("DBqueryS", "Https response is: " + responseCode); 

      InputStream is = null; 
      is = connection.getInputStream(); 
      String responseStr = readIt(is, 1); 

      if (responseStr != null) { 
       return responseStr; 
      }else{ 
       Log.i("HTTP RESPONSE","NO RESPONSE"); 
      } 
     } catch (ClientProtocolException e) { 
      Log.e("CONN_EXCEPTION", e.toString()); 
     } catch (IOException e) { 
      Log.e("CONN_EXCEPTION",e.toString()); 
     } 
     return "FAILED"; 
    } 

    // Reads an InputStream and converts it to a String. 
    public String readIt(InputStream stream, int len) throws IOException { 
     String str = ""; 
     Reader reader; 
     reader = new InputStreamReader(stream, "UTF-8"); 
     char[] buffer = new char[len]; 
     while(reader.read(buffer) > 0){ 
      str+=String.valueOf(buffer); 
     } 
     Log.i("DBqueryS", "Read " + str.length() + " characters."); 
     if(str.length()>0)return str; 
     return null; 
    } 

    private String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException{ 
     StringBuilder result = new StringBuilder(); 
     boolean first = true; 

     for (NameValuePair pair : params){ 
      if (first) 
       first = false; 
      else 
       result.append("&"); 

      result.append(URLEncoder.encode(pair.getName(), "UTF-8")); 
      result.append("="); 
      result.append(URLEncoder.encode(pair.getValue(), "UTF-8")); 
     } 
     return result.toString(); 
    } 
} 

有關HttpsURLConnection的和的AsyncTask是指這些頁面的詳細信息: http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html

http://developer.android.com/reference/android/os/AsyncTask.html

+0

嘿。我實際上想知道在android應用程序中使用什麼代碼來連接到服務器。我已經知道如何使用IP地址連接。 –

相關問題