最近在做一個APP,需要與服務器通信,一點一點的嘗試,記錄一下。
本文使用了OkHttp和Flask框架。
Android客戶端:
實現功能輸入完點擊OK按鈕后會toast成功的信息。
Python服務端:
各部分代碼如下:
activity_main.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:orientation="vertical" 7 tools:context=".MainActivity"> 8 9 <EditText 10 android:id="@+id/username" 11 android:layout_width="match_parent" 12 android:layout_height="wrap_content" 13 android:layout_marginTop="20dp" 14 android:hint="username" /> 15 16 <EditText 17 android:id="@+id/password" 18 android:layout_width="match_parent" 19 android:layout_height="wrap_content" 20 android:layout_marginTop="10dp" 21 android:hint="password" /> 22 23 <Button 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" 26 android:layout_gravity="center_horizontal" 27 android:layout_marginTop="10dp" 28 android:id="@+id/ok" 29 android:text="ok" /> 30 31 </LinearLayout>
為了使用OkHttp,需要在build.gradle中添加:implementation 'com.squareup.okhttp3:okhttp:3.11.0'
MainActivity.java:
1 package com.example.vesper.userpwd; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.EditText; 8 import android.widget.Toast; 9 10 import java.io.IOException; 11 12 import okhttp3.Call; 13 import okhttp3.Callback; 14 import okhttp3.FormBody; 15 import okhttp3.OkHttpClient; 16 import okhttp3.Request; 17 import okhttp3.Response; 18 19 public class MainActivity extends AppCompatActivity { 20 21 private Button ok; 22 private EditText username; 23 private EditText password; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 ok = findViewById(R.id.ok); 30 username = findViewById(R.id.username); 31 password = findViewById(R.id.password); 32 33 34 ok.setOnClickListener(new View.OnClickListener() { 35 @Override 36 public void onClick(View v) { 37 String name = String.valueOf(username.getText()); 38 String pass = String.valueOf(password.getText()); 39 String url = "http://192.168.xxx.xxx:5000/register";//替換成自己的服務器地址 40 SendMessage(url, name, pass); 41 } 42 }); 43 } 44 45 46 private void SendMessage(String url, final String userName, String passWord) { 47 OkHttpClient client = new OkHttpClient(); 48 FormBody.Builder formBuilder = new FormBody.Builder(); 49 formBuilder.add("username", userName); 50 formBuilder.add("password", passWord); 51 Request request = new Request.Builder().url(url).post(formBuilder.build()).build(); 52 Call call = client.newCall(request); 53 call.enqueue(new Callback() { 54 @Override 55 public void onFailure(Call call, IOException e) { 56 runOnUiThread(new Runnable() { 57 @Override 58 public void run() { 59 runOnUiThread(new Runnable() { 60 @Override 61 public void run() { 62 Toast.makeText(MainActivity.this, "服務器錯誤", Toast.LENGTH_SHORT).show(); 63 } 64 }); 65 } 66 }); 67 } 68 69 @Override 70 public void onResponse(Call call, final Response response) throws IOException { 71 final String res = response.body().string(); 72 runOnUiThread(new Runnable() { 73 @Override 74 public void run() { 75 if (res.equals("0")) { 76 runOnUiThread(new Runnable() { 77 @Override 78 public void run() { 79 Toast.makeText(MainActivity.this, "該用戶名已被注冊", Toast.LENGTH_SHORT).show(); 80 } 81 }); 82 } else { 83 runOnUiThread(new Runnable() { 84 @Override 85 public void run() { 86 Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show(); 87 } 88 }); 89 90 } 91 92 } 93 }); 94 } 95 }); 96 97 } 98 }
服務器端:userpwd.py:
1 from flask import Flask 2 from flask import request 3 import os 4 5 app = Flask(__name__) 6 7 @app.route('/') 8 def test(): 9 return '服務器正常運行' 10 11 12 13 #此方法處理用戶注冊 14 @app.route('/register',methods=['POST']) 15 def register(): 16 username=request.form['username'] 17 password=request.form['password'] 18 19 print('username:'+username) 20 print('password:'+password) 21 return '注冊成功' 22 23 if __name__ == '__main__': 24 app.run(host='0.0.0.0')
遇到的問題:
1.一開始總是通信不上,提示服務器錯誤,原來是因為沒有增加一條權限:<uses-permission android:name="android.permission.INTERNET"/>