python 實現聊天室
阿新 • • 發佈:2019-01-14
服務端程式碼:
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): print(s) response = requests.post("http://www.tuling123.com/openapi/api", data={ "key": "4105cb6db8c54f5db470b6c0ee42d24b", "info": s}) response = response.json() answer = response['text'] 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.insert('end', "客戶端@" + str(caddr[1]) + "終止了對話\n") Text_Show.see(tkinter.END) break else: Text_Show.insert('end', "來自客戶端@" + str(caddr[1]) + "的訊息為:" + data + '\n') Text_Show.see(tkinter.END) # 傳送資料 time.sleep(0.2) data = AI_Talk(data) # # data = '請輸入傳送至客戶端的資料: 123123' #如果要手動輸入的話就要設定好執行緒sleep時間不然還沒有輸入,就已經到其他執行緒了,就會發不出去。 sock.sendall(bytes(data, 'UTF-8')) 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) 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()
客戶端程式碼:
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 cs, Text_Show, Send_Show # 傳送按鍵的函式 def Click_Send(): sendData = Send_Show.get() # 獲取輸入內容 if sendData == 'quit': Text_Show.insert(tkinter.END, "與伺服器連線已斷開" + "\n") Text_Show.see(tkinter.END) cs.sendall(bytes(sendData, encoding="utf8")) cs.close() else: Text_Show.insert(tkinter.END, "客戶端:" + sendData + "\n") Text_Show.see(tkinter.END) cs.sendall(bytes(sendData, encoding="utf8")) Send_Show.delete(0, END) # 執行緒函式,迴圈接受客戶端訊息 def Receive_Data(): while True: accept_data = str(cs.recv(1024), encoding="utf8") Text_Show.insert(tkinter.END, "伺服器:" + accept_data + "\n") Text_Show.see(tkinter.END) # 主函式 if __name__ == "__main__": # 初始化GUI 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=70, height=15) Text_Show.bind("<KeyPress>", lambda e: "break") Text_Show.pack(side="bottom", fill='both', expand=True) # 底部訊息傳送部分 frame3 = Frame(root) frame3.pack() e3 = StringVar() Send_Show = Entry(frame3, textvariable=e3, width=60) buttontext2 = tkinter.StringVar() buttontext2.set('傳送') button_Send = tkinter.Button(frame3, width=10, textvariable=buttontext2, command=Click_Send) Send_Show.pack(side="left") button_Send.pack(side="left") frame3.pack() # 初始化TCP協議 HOST = '127.0.0.1' PORT = 4700 BUFSIZ = 1024 ADDR = (HOST, PORT) cs = socket(AF_INET, SOCK_STREAM, 0) cs.connect(ADDR) thread = threading.Thread(target=Receive_Data) thread.start() root.mainloop()
執行效果: