最近在做一個APP,需要與服務器通信,一點一點的嘗試,記錄一下。
本文使用了OkHttp和Flask框架。
Android客戶端:
實現功能輸入完點擊OK按鈕后會toast成功的信息。
Python服務端:
各部分代碼如下:
activity_main.xml:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:hint="username" />
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:hint="password" />
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:id="@+id/ok"
android:text="ok" />
為了使用OkHttp,需要在build.gradle中添加:implementation 'com.squareup.okhttp3:okhttp:3.11.0'
MainActivity.java:
package com.example.vesper.userpwd;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private Button ok;
private EditText username;
private EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ok = findViewById(R.id.ok);
username = findViewById(R.id.username);
password = findViewById(R.id.password);
ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = String.valueOf(username.getText());
String pass = String.valueOf(password.getText());
String url = "http://192.168.xxx.xxx:5000/register";//替換成自己的服務器地址
SendMessage(url, name, pass);
}
});
}
private void SendMessage(String url, final String userName, String passWord) {
OkHttpClient client = new OkHttpClient();
FormBody.Builder formBuilder = new FormBody.Builder();
formBuilder.add("username", userName);
formBuilder.add("password", passWord);
Request request = new Request.Builder().url(url).post(formBuilder.build()).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "服務器錯誤", Toast.LENGTH_SHORT).show();
}
});
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (res.equals("0")) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "該用戶名已被注冊", Toast.LENGTH_SHORT).show();
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
});
}
}
服務器端:userpwd.py:
from flask import Flask
from flask import request
import os
app = Flask(__name__)
@app.route('/')
def test():
return '服務器正常運行'
#此方法處理用戶注冊
@app.route('/register',methods=['POST'])
def register():
username=request.form['username']
password=request.form['password']
print('username:'+username)
print('password:'+password)
return '注冊成功'
if __name__ == '__main__':
app.run(host='0.0.0.0')
遇到的問題:
1.一開始總是通信不上,提示服務器錯誤,原來是因為沒有增加一條權限:
Android客戶端與Python服務器端通信之上傳圖片
繼上篇成功的與服務器端通信上之后,我現在需要將安卓本地的圖片上傳到服務端.服務端接收圖片存下來. 參考:https://blog.csdn.net/qq_26906345/article/detail ...
Android客戶端與Eclipse服務器端的Socket通信
Server端代碼 用來實現客戶端socket的監聽 package MyServer; import java.io.BufferedReader; import java.io.BufferedW ...
android 客戶端支付寶 php服務器端編寫
生成私鑰 輸入“genrsa -out rsa_private_key.pem 1024”命令,回車后,在當前 bin 文件目 錄中會新增一個 rsa_private_key.pem 文件,其文件為原 ...
Android中兩個Activity之間簡單通信
在Android中,一個界面被稱為一個activity,在兩個界面之間通信,采用的是使用一個中間傳話者(即Intent類)的模式,而不是直接通信. 下面演示如何實現兩個activity之間的通信. 信 ...
Socket 通信原理(Android客戶端和服務器以TCP&;&;UDP方式互通)
轉載地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有關通信原理內容是在網上或百科整理得到,代碼部分為本人所寫,如果不當 ...
Android客戶端與數據庫交互數據的簡單學習
?? 數據庫整理方案如下: 一.Android+ webservices+SQLServer? : 通過webservices客戶端向指定服務器發送請求,服務器響應返回指定格式的數據,如json或者x ...
Python網絡編程-Socket簡單通信(及python實現遠程文件發送)
學習python中使用python進行網絡編程,編寫簡單的客戶端和服務器端進行通信,大部分內容來源于網絡教程,這里進行總結供以后查閱. 先介紹下TCP的三次握手: 1,簡單的發送消息: 服務器端: i ...
Android客戶端和服務器端數據交互
網上有很多例子來演示Android客戶端和服務器端數據如何實現交互不過這些例子大多比較繁雜,對于初學者來說這是不利的,現在介紹幾種代碼簡單.邏輯清晰的交互例子,本篇博客介紹第四種: 一.服務器端: 代 ...
socket 通信 入門3 android 客戶端 C# 服務端
這是一個android端操控服務器的例子 ?就是發送簡單指令到服務器 ?然后服務器響應什么的... 當然這里是未完成的 ?只是簡單展示一下大致思路 首先連接建立起來后 ?服務端給客戶端一條信息 ?告訴 ...
隨機推薦
oracle正則表達式的用法
Oracle 正則表達式函數-REGEXP_SUBSTR 使用例子 .5個參數 第一個是輸入的字符串 第二個 ...
修改Broforce無限人數,死亡不減反加
看B站直播發現這個有趣的游戲,找了半天修改器無效,Cheat Engine怎么找指針有點忘了,直接找數值每關都要重來,想來想去還是簡單粗暴的反編譯好了. 順便做下C#反編譯備忘. 首先把DLL反成IL ...
AWS Summit 2014 San Francisco站總結
我上個月去San Francisco參加了AWS Summit 2014 會議,總結一下參加這個會議的情況. 什么是AWS Summit? AWS Summit 是AWS在全球各地舉辦的,針對AWS用 ...
Tarjan+模板
#include #include #include #include #in ...
Flash上傳組件之SWFUpload文件上傳
一.什么是SWFUpload? SWFUpload是一個客戶端文件上傳工具,最初由Vinterwebb.se開發,它通過整合Flash與JavaScript技術為WEB開發者提供了一個具有豐富功能繼而 ...
JS操作DOM元素屬性和方法
Dom元素基本操作方法API,先記錄下,方便以后使用. W3C DOM和JavaScript很容易混淆不清.DOM是面向HTML和XML文檔的API,為文檔提供了結構化表示,并定義了如何通過腳本來訪 ...
---添加一條記錄返回一條記錄的ID
INSERT INTO Web_AD(PID,ADType,ADTitle,ADTitle1,ADTitle2,ADTarget,LinkURL,DispalyWords,ADCode,UploadI ...
分享到QQ空間、新浪微博、騰訊微博和人人網
function shareys(type, url, title, img, content) { switch (type) { case "sina": url = &quo ...
The Beam Model:Stream &;amp; Tables翻譯(上)
本文由??網易云發布. 作者:周思華 本篇文章僅限內部分享,如需轉載,請聯系網易獲取授權. 本文嘗試描述Beam模型和Stream & Table理論間的關系(前者描述于數據流模型論文.the ...
一文入門HTML5
1.HTML5 上節回顧:一文讀懂ES6(附PY3對比) | 一文入門NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...