1. 程式人生 > >Android客戶端與伺服器連線通訊

Android客戶端與伺服器連線通訊

遇到一個小問題:
第一個Activity與伺服器連線時能夠成功連線
但是利用跳轉之後的Activity與伺服器連線一直不成功
解決:
在登陸時呼叫connect方法與伺服器連線,Activity跳轉之後就會斷開連線,因為連線函式是直接寫在Activity中的所以在進入新的Activity中時就在進行一次連線就可以正常傳輸資料了

// Activity中定義方法connect呼叫此方法時就會與伺服器連線
連線伺服器採用的非同步執行緒的方式

其中讀取資料和寫入資料部分即利用grtoutputstream函式和getinputstream函式

引用塊內容

 writer = new
BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

這部分不能寫在主執行緒中,否則會報錯
連線伺服器的函式
採用非同步執行緒AsyncTask,

socket = new Socket(“192.168.1.7”, 12333);

     前一個為伺服器的ip地址,後一個為伺服器的埠

IP地址為電腦在區域網中的IP地址不知道的可以通過在命令列中輸入ipconfig
後面的埠號則是我設計伺服器時自己寫的埠號,不知道的可以看下

java設計開發服務端
服務端的原始碼下載

    private Socket socket = null;     //套接字
    private BufferedReader reader = null;    //用來儲存讀取資料的變數
    private BufferedWriter writer = null;       //用來儲存輸入資料的變數

    public void connect() {
        read = new AsyncTask<Void, String, Void>() {
            // 從網路讀取資料,傳入值,中間過程,結果值
@Override protected Void doInBackground(Void... params) { try { socket = new Socket("192.168.1.7", 12333); // 前一個為伺服器的ip地址,後一個為伺服器的埠 writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); isconnect = true; //isconnect是我自己定義的一個布林常量用來判斷連線是否成功的 ,與本次連線無關 } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { String line; while ((line = reader.readLine()) != null) { publishProgress(line); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { system.out.println(values[0]); //values[0]就是伺服器傳送過來的訊息 super.onProgressUpdate(values); } }; read.execute(); }

在登入介面是能夠正常與伺服器通訊,但是利用Intent
跳轉到新的Activity時,就不能進行連線
登入介面的跳轉程式碼

@Override
            protected void onProgressUpdate(String... values) {

    String[] a = values[0].split(" ");
                super.onProgressUpdate(values);
                //此if判斷使用者名稱和密碼是否錯誤
                if (a[0].equals("customer") && a[1].equals("login")) {
                    if (a[2].equals("true")) {

                        if (isconnect) {
                            try {
                                socket.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            Intent intent_login = new Intent(CustomerLogin.this, CustomerMenu.class);
                            intent_login.putExtra("phone", username.getText().toString());
                            startActivity(intent_login);
                            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
                            CustomerLogin.this.finish();

                        } else {
                            MyToast("當前網路連線不可用");
                        }
                    } else {
                        MyToast("使用者名稱或密碼錯誤");
                        }

                }
            }
Mytoast是我自己定義的吐司函式