在線聊天服務端
import tkinter import tkinter.font as tkFont import socket import threading import time import sys class ServerUI():local='127.0.0.1'port=5505global serverSock;flag=Falsedef __init__(self):self.root=tkinter.Tk()self.root.title('在線聊天-服務端v1.0')self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)ft=tkFont.Font(family='Fixdsys',size=11)self.chatText=tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)self.chatText['yscrollcommand']=self.chatTextScrollBar.setself.chatText.pack(expand=1,fill=tkinter.BOTH)self.chatTextScrollBar['command']=self.chatText.yview()self.frame[0].pack(expand=1,fill=tkinter.BOTH)label=tkinter.Label(self.frame[1],height=2)label.pack(fill=tkinter.BOTH)self.frame[1].pack(expand=1,fill=tkinter.BOTH)#輸入消息text的滾動條self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#輸入消息并與滾動條綁定ft=tkFont.Font(family='Fixdsys',size=11)self.inputText=tkinter.Text(self.frame[2],width=70,height=8,font=ft)self.inputText['yscrollcommand']=self.inputTextScorllBar.setself.inputText.pack(expand=1,fill=tkinter.BOTH)self.inputTextScorllBar['command']=self.chatText.yview()self.frame[2].pack(expand=1,fill=tkinter.BOTH)#發送按鈕self.sendButton=tkinter.Button(self.frame[3],text='發送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#關閉按鈕self.closeButton=tkinter.Button(self.frame[3],text='關閉', width=10,command=self.close)self.closeButton.pack(expand=1,side=tkinter.RIGHT,padx=25,pady=5)self.frame[3].pack(expand=1,fill=tkinter.BOTH)#接收消息def receiveMessage(self) :#建立 Socket 連接self.serverSock=socket.socket(socket.AF_INET ,socket.SOCK_STREAM)self.serverSock.bind((self.local, self.port))self.serverSock.listen(15)self.buffer=1024self.chatText.insert(tkinter.END ,'服務器已經就緒 ......')#循環接受客戶端的連接請求while True:self.connection,self.address=self.serverSock.accept()self.flag=Truewhile True :#接收客戶端發送的消息self.cientMsg=self.connection.recv(self.buffer).decode('utf-8')if not self.cientMsg:continueelif self.cientMsg=='Y':self.chatText.insert(tkinter.END ,'服務器端己經與客戶端建立連接 .....')self.connection.send(b'Y')elif self.cientMsg=='N':self.chatText.insert(tkinter.END ,'服務器端與客戶端建立連接失敗 .....')self.connection.send(b'N')else :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'客戶端'+ theTime +'說: \n')self.chatText.insert(tkinter.END ,' '+ self.cientMsg)#發送消息def sendMessage(self):#得到用戶在 Text 中輸入的消息message=self.inputText.get ('1.0',tkinter.END)#格式化當前的時間theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服務器' + theTime + '說: \n')self.chatText.insert(tkinter.END,' '+message +'\n')if self.flag==True :#將消息發送到客戶端 self.connection.send(message.encode())else:#Socket 連接沒有建立,提示用戶self.chatText.insert(tkinter.END,'您還未與客戶端建立連接,客戶端無法接收你的消息\n')#清空用戶在Text中輸入的消息self.inputText.delete(0.0,message.__len__()-1.0)#關閉消息窗口并退出def close(self):sys.exit()#啟動線程接收客戶端的消息def startNewThread(self) :#啟動一個新線程來接收客戶端的消息#args是傳遞給線程函數的參數 receiveMessage 函數不需要參數,只傳一個空元組thread=threading.Thread(target=self.receiveMessage,args=())thread.setDaemon(True);thread.start();def main():server=ServerUI()server.startNewThread()server.root.mainloop()if __name__ == '__main__':main()
在線聊天客戶端
import tkinter import tkinter.font as tkFont import socket import threading import time,sys class ClientUI():local='127.0.0.1'port=5505global clientSock;flag=False#初始化類的相關屬性的構造函數def __init__(self):self.root=tkinter.Tk()self.root.title('在線聊天-客戶端v1.0')#窗口面板,用四個面板布局self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]#顯示消息Text右邊的滾動條self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#顯示消息Text,并綁定上面的滾動條ft=tkFont.Font(family='Fixdsys',size=11)self.chatText=tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)self.chatText['yscrollcommand']=self.chatTextScrollBar.setself.chatText.pack(expand=1,fill=tkinter.BOTH)self.chatTextScrollBar['command']=self.chatText.yview()self.frame[0].pack(expand=1,fill=tkinter.BOTH)#標簽,分開消息顯示Text和消息輸入Textlabel=tkinter.Label(self.frame[1],height=2)label.pack(fill=tkinter.BOTH)self.frame[1].pack(expand=1,fill=tkinter.BOTH)#輸入消息text的滾動條self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#輸入消息并與滾動條綁定ft=tkFont.Font(family='Fixdsys',size=11)self.inputText=tkinter.Text(self.frame[2],width=70,height=8,font=ft)self.inputText['yscrollcommand']=self.inputTextScorllBar.setself.inputText.pack(expand=1,fill=tkinter.BOTH)self.inputTextScorllBar['command']=self.chatText.yview()self.frame[2].pack(expand=1,fill=tkinter.BOTH)#發送按鈕self.sendButton=tkinter.Button(self.frame[3],text='發送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#關閉按鈕self.closeButton=tkinter.Button(self.frame[3],text='關閉', width=10,command=self.close)self.closeButton.pack(expand=1,side=tkinter.RIGHT,padx=25,pady=5)self.frame[3].pack(expand=1,fill=tkinter.BOTH)#接收消息def receiveMessage(self) :try:#建立 Socket 連接self.clientSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.clientSock.connect((self.local,self.port))self.flag=Trueexcept:self.flag=Falseself.chatText.insert(tkinter.END,'您還未與客戶端建立連接,請檢查服務器是否啟動......')returnself.buffer=1024self.clientSock.send('Y'.encode())#向服務器發送字符'Y',表示客戶端要連接服務器while True:try:if self.flag==True:#連接建立,接受服務器端消息self.serverMsg=self.clientSock.recv(self.buffer).decode('utf-8')if self.serverMsg=='Y':self.chatText.insert(tkinter.END ,'客戶端己經與服務端建立連接 .....')elif self.serverMsg=='N':self.chatText.insert(tkinter.END ,'客戶端端與服務端建立連接失敗 .....')elif not self.serverMsg:continueelse :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服務端' + theTime + '說: \n')self.chatText.insert(tkinter.END ,' ' + self.serverMsg)else:breakexcept EOFError as msg:raise msgself.clientSock.close()breakdef sendMessage(self) :#得到用戶在 Text 中輸入的消息message=self.inputText.get ('1.0',tkinter.END)#格式化當前的時間theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END,'客戶端'+ theTime +'說: \n')self.chatText.insert(tkinter.END,' '+message+'\n')if self.flag==True:#將消息發送到服務端 self.clientSock.send(message.encode())else:#Socket 連接沒有建立,提示用戶self.chatText.insert(tkinter.END,'您還未與服務端建立連接,客戶端無法接收你的消息\n')#清空用戶在Text中輸入的消息self.inputText.delete(0.0,message.__len__()-1.0)#關閉消息窗口并退出def close(self):sys.exit()#啟動線程接收客戶端的消息def startNewThread(self) :#啟動一個新線程來接收客戶端的消息#args是傳遞給線程函數的參數receiveMessage 函數不需要參數,只傳一個空元組thread=threading.Thread(target=self.receiveMessage,args=())thread.setDaemon(True);thread.start(); def main() :client=ClientUI()client.startNewThread()client.root.mainloop()if __name__ == '__main__':main()
?
?