建立一個簡易的python服務器端android客戶端的聊天應用app

持續更新中...

python服務器端

Tkinter

kinter 模塊(Tk 接口)是 Python 的標準 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多數的 Unix 平臺下使用,同樣可以應用在 Windows 和 Macintosh 系統裏。Tk8.0 的後續版本可以實現本地窗口風格,並良好地運行在絕大多數平臺中

教程鏈接:http://www.runoob.com/python/python-gui-tkinter.html

本文中用到的函數

tkinter.TK() #創建一個窗口程序

*.title() #更改窗口標題

tkinter.Frame() #在屏幕上顯示一個矩形區域,多用於容器

tkinter.pack() #tkinter的幾何方法?包裝 

--- side表示放置位置

--- fill表示

---expand表示

Label() 可以顯示文本?

守護線程

守護進程(Daemon)是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。

Thread

利用threading.thread(func, args)初始一個新進程

調用.start()來啓用進程

 

python服務器端code

import socket
import time
import tkinter
from tkinter.scrolledtext import ScrolledText
import threading
import requests
import tkinter
from socket import *
from time import ctime
from tkinter import *

global Text_Show

def AI_Talk(s):
    response = requests.post("http://www.tuling123.com/openapi/api",
                             data={
                                 "key":"5636c0854e88430383a861151bf764ca",
                                 "info":s,
                                 "userid":"123456"
                                 })
    response = response.json()
    answer = response['text']
    print(type(answer))
    print(answer)
    return answer

def Sever_Thread(sock,caddr):
    Text_Show.insert("end","客戶端@"+str(caddr[1])+"已連接\n")
    while True:
        data = str(sock.recv(1024).decode('UTF-8'))
        if data=='quit':
            Text_Show('end','客戶端@'+str(caddr[1])+'終止了對話')
            Text_Show.see(tkinter.END)
        else:
            Text_Show.insert('end','來自客戶端@'+str(caddr[1])+'的消息爲:'+data+'\n')
            Text_Show.see(tkinter.END)
        time.sleep(0.2)
        data=AI_Talk(data)
        sock.sendall(bytes(data,'UTF-8'))
    Text_Show.insert('end',"線程關閉")
    sock.close()

def Sever_Accept(ss):
    while True:
        sock,caddr=ss.accept()
        Thread2 = threading.Thread(target=Sever_Thread, args = (sock, caddr))
        Thread2.daemon=True
        Thread2.start()

def Sever_Init():
    HOST =''
    PORT = 4700
    ADDR = (HOST, PORT)
    print(ADDR)
    ss = socket(AF_INET, SOCK_STREAM, 0) 
    ss.bind(ADDR) 
    ss.listen(20) #允許最大監聽數 
    Thread1=threading.Thread(target=Sever_Accept,args=(ss,)) 
    Thread1.daemon=True #線程守護 
    Thread1.start()#主函數

if __name__ == "__main__":  
    root=tkinter.Tk() 
    root.title("聊天小程序服務器端 ") 
    frame1=Frame(root) 
    frame1.pack() 
    IP_Show_Label=Label(frame1,text="默認IP:127.0.0.1\n默認端口爲6000\n無法更改!!!") 
    IP_Show_Label.pack(side='left') 
    frame2=Frame(root) 
    frame2.pack() 
    Text_Show=ScrolledText(frame2,width=100,height=30) 
    Text_Show.bind("<KeyPress>",lambda e:"break") 
    Text_Show.pack(side="bottom",fill = 'both', expand = True) 
    Sever_Init() 
    root.mainloop()

 

Android端

參考SharePreference:https://www.cnblogs.com/smyhvae/p/4019379.html

Android系統一共提供了四種數據存儲方式。分別是:SharePreference、SQLite、Content Provider和File;此外還有一種網絡存儲。由於Android系統中,數據基本都是私有的,都是存放於“data/data/程序包名”目錄下,所以要實現數據共享,正確方式是使用Content Provider。

在Android中,可以使用幾種方式實現數據持久化:

  • Shared Preferences:除SQLite數據庫外,另一種常用的數據存儲方式。共享參數形式,一種以Key-Value的鍵值對形式保存數據的方式,其本質就是一個xml文件。Android內置的,一般應用的配置信息,推薦使用此種方式保存。
  • Internal Storage:使用Android設備自帶的內存存儲數據。
  • External Storage:使用外部存儲設備存儲數據,一般是指Sdcard。
  • SQLite Databases:以SQLite數據庫存儲結構化的數據。SQLite是一個輕量級的數據庫,支持基本SQL語法,是常被採用的一種數據存儲方式。Android爲此數據庫提供了一個名爲SQLiteDatabase的類,封裝了一些操作數據庫的API。
  • Network Connection:使用基於網絡的服務獲取數據。

 個人認爲:sharePreference適合輕量數據永久保存,sqlite是小型數據庫,content provider應該是進程間通訊的搬運工(可以實現系統應用與app之間的通信)

相機實現

參考:https://blog.csdn.net/ww897532167/article/details/71525514/

startActivityForResult() 參考https://blog.csdn.net/csr_yang/article/details/31034291

GPS實現

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章