1. 程式人生 > >如何往伺服器中讀寫資料?

如何往伺服器中讀寫資料?

本次專案,我用apache-tomcat將自己的計算機弄成了一個小伺服器,然後對裡面的jsp型別的檔案進行讀寫。

首先,如何弄伺服器呢?工程檔案:點選開啟連結

1.下載一個apache-tomcat,這裡我給大家提供一個apache-tomcat-6.0.37的下載地址:點選開啟連結   提取碼:utb8

2.下載好之後解壓,解壓完成,進入資料夾,執行apache-tomcat-6.0.37/bin/startup.dat  如下圖所示。




3.開啟該檔案之後,等待。等到程序完成後。開啟你的瀏覽器,在位址列中鍵入:localhost:8080   

跳轉,如果可以正常訪問到有貓的介面,那麼恭喜,伺服器已建立。

伺服器建好了,那麼該讀取其中的資料了。

這裡的佈局我設了一個EditView,用於輸入IP地址,兩個按鈕,分別是不同的獲取資訊的方式,而文字框,則是為了顯示讀取的資訊。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="jerehdu.com.jereheduch10.HttpActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="IP地址"
        android:textSize="20sp"
        android:textColor="#123"/>
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/et"
        android:hint="請輸入IPv4地址"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/search1"
        android:text="查詢(Get方式)"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/search2"
        android:text="查詢(Post方式)"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/show"
        android:text="查詢結果"
        android:background="#e9d6ec"/>
</LinearLayout>
接下來是Acticity,裡面有詳細的註釋,我就不在這裡說了。
public class HttpActivity extends AppCompatActivity {

    private EditText et ;
    private Button search1;
    private Button search2;
    private TextView show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_http);
        et = (EditText) findViewById(R.id.et);
        search1 = (Button) findViewById(R.id.search1);
        search2 = (Button) findViewById(R.id.search2);
        show = (TextView) findViewById(R.id.show);
        search1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String url =
                        "http://"+et.getText()+":8080/HttpTest/index.jsp" +
                                "?option=getUser&uName=jerehedu";
                new MyGetJob().execute(url);
            }
        });
        search2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String[] arg = new String[2];
                arg[0] = "http://"+et.getText()+":8080/HttpTest/index.jsp";
                arg[1] = "option=getUser&uName=jerehedu";
                new MyPostJob().execute(arg);
            }
        });
    }

    public class MyPostJob extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... strings) {
            HttpURLConnection httpURLConnection = null;
            InputStream is = null;
            StringBuilder sbd = new StringBuilder();
            try {
                URL url = new URL(strings[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setConnectTimeout(5*1000);
                httpURLConnection.setReadTimeout(5*1000);
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setDoInput(true);
                httpURLConnection.setDoOutput(true);
                //是否儲存使用者快取
                httpURLConnection.setUseCaches(false);
                //在這裡設定編碼方式
                httpURLConnection.setRequestProperty("Charset","UTF-8");
                httpURLConnection.setRequestProperty("Content-type","application/x-www-form-urlencoded");
                //params應該是這樣的樣式: option=getUser&Name=jerehedu  (沒了問號)
                String params = strings[1];
                OutputStream os = httpURLConnection.getOutputStream();
                os.write(params.getBytes());
                os.flush();
                os.close();

                if(httpURLConnection.getResponseCode()==200){
                    is=httpURLConnection.getInputStream();
                    int next = 0;
                    byte[] bt = new byte[1024];
                    while ((next=is.read(bt))>0){
                        sbd.append(new String(bt,0,next));
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(httpURLConnection!=null){
                    httpURLConnection.disconnect();
                }
            }
            return sbd.toString();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            show.setText("POST請求結果:"+s);

        }
    }
    /*
    AsyncTask非同步任務類
      非同步任務類的第一個引數會傳到doInBackground方法中
      第三個引數:
          此為指定doInBackground方法的返回值。
          onPostExecute方法中的String s是來自doInBackground方法的返回值。
      UI執行緒裡宣告的任何變數,在子執行緒中禁止操作。

     非同步任務類裡只有5個方法。

     */
    public class MyGetJob extends AsyncTask<String,Void,String>{

        //onPreExecute在主執行緒中執行命令,它會在doInBackground前執行。
        //通常會在這裡做進度條的初始化,例如:下載進度
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        //必須實現的方法,可以理解成,在子執行緒中執行命令
        @Override
        //這裡的...代表陣列
        protected String doInBackground(String... strings) {
            HttpURLConnection httpURLConnection = null;
            InputStream is = null;
            StringBuilder sbd = new StringBuilder();
            try {
                URL url = new URL(strings[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                httpURLConnection.setConnectTimeout(5*1000);
                httpURLConnection.setReadTimeout(5*1000);
                 /*
                    http 響應碼
                    200:成功
                    404:未找到
                    500:發生錯誤
                     */
                if(httpURLConnection.getResponseCode()==200){
                    is=httpURLConnection.getInputStream();
                    int next = 0;
                    byte[] bt = new byte[1024];
                    while ((next=is.read(bt))>0){
                        sbd.append(new String(bt,0,next));
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(is!=null){
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(httpURLConnection!=null){
                    httpURLConnection.disconnect();
                }
            }
            return sbd.toString();
        }

        //在UI執行緒(主執行緒)中執行命令
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute("GET請求結果:"+s);
            show.setText(s);
        }
    }
}
在執行的時候,需要我們輸入IP地址,即我們伺服器的IP地址,怎麼獲得呢?

首先我們開啟“執行”——Windows+R,然後輸入CMD,確認。之後再輸入ipconfig,回車。則就可以看到IP地址了,如下圖所示:




輸入IP地址,點選按鈕。效果圖如下: