1. 程式人生 > >python 實現聊天室

python 實現聊天室

服務端程式碼:

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()

執行效果: