Android客戶端與Python服務器端的簡單通信


最近在做一個APP,需要與服務器通信,一點一點的嘗試,記錄一下。

本文使用了OkHttp和Flask框架。

參考博文:https://ai-exception.com/2018/06/13/%E4%BD%BF%E7%94%A8python%E6%90%AD%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E5%AE%9E%E7%8E%B0Android%E7%AB%AF%E4%B8%8E%E4%B9%8B%E9%80%9A%E4%BF%A1/

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"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM