Android客戶端與伺服器連線通訊
阿新 • • 發佈:2019-01-22
遇到一個小問題:
第一個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是我自己定義的吐司函式