在線聊天程序設計的步驟
1、在線聊天程序的服務器端
import tkinter
import tkinter.font as tkFont
import socket
import threading
import time, sys
class ServerUI():
local = '127.0.0.1'
port = 5505
global serverSock
flag = False
def __init__(self):
self.root = tkinter.Tk()
self.root.title('Python在線聊天-服務器端V1.0')
self.frame = [tkinter.Frame(), tkinter.Frame(), tkinter.Frame(), tkinter.Frame()]
self.chatTextScollBar = tkinter.Scrollbar(self.frame[0])
self.chatTextScollBar.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.chatTextScollBar.set
self.chatText.pack(expand = 1, fill = tkinter.BOTH)
self.chatTextScollBar['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)
self.inputTextScrollBar = tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.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)
ft = tkFont.Font(family = 'Fixdsys', size = 11)
self.inputText = tkinter.Text(self.frame[2], width = 70, height = 8, font = ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand = 1, fill = tkinter.BOTH)
self.inputTextScrollBar['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):
self.serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serverSock.bind((self.local, self.port))
self.serverSock.listen(15)
self.buffer = 1024
self.chatText.insert(tkinter.END, '服務器已經就緒......')
while True:
self.connection, self.address = self.serverSock.accept()
self.flag = True
while True:
self.cienMsg = self.connection.recv(self.buffer).decode('utf-8')
if not self.cienMsg:
continue
elif self.cienMsg == 'Y':
self.chatText.insert(tkinter.END, '服務器端已經與客戶端建立連接......')
self.connection.send(b'Y')
elif self.cienMsg == '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.cienMsg)
def sendMessage(self):
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:
self.chatText.insert(tkinter.END, '您還未與客戶端建立連接, 客戶端無法收到您的消息\n')
self.inputText.delete(0.0, message.__len__()-1.0)
def close(self):
sys.exit()
def startNewThread(self):
thread = threading.Thread(target=self.receiveMessage, args = ())
thread.setDaemon(True)
thread.start()
def main1():
server = ServerUI()
server.startNewThread()
server.root.mainloop()
main1()
2、在線聊天程序的客戶端
class ClientUI():
local = '127.0.0.1'
port = 5505
global clientSock
flag = False
def __init__(self):
self.root = tkinter.Tk()
self.root.title('Python在線聊天-客戶端V1.0')
self.frame = [tkinter.Frame(), tkinter.Frame(), tkinter.Frame(), tkinter.Frame()]
self.chatTextScollBar = tkinter.Scrollbar(self.frame[0])
self.chatTextScollBar.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.chatTextScollBar.set
self.chatText.pack(expand = 1, fill = tkinter.BOTH)
self.chatTextScollBar['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)
self.inputTextScrollBar = tkinter.Scrollbar(self.frame[2])
self.inputTextScrollBar.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)
ft = tkFont.Font(family = 'Fixdsys', size = 11)
self.inputText = tkinter.Text(self.frame[2], width = 70, height = 8, font = ft)
self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
self.inputText.pack(expand = 1, fill = tkinter.BOTH)
self.inputTextScrollBar['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:
self.clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.clientSock.connect((self.local, self.port))
self.flag = True
except:
self.flag =False
self.chatText.insert(tkinter.END, '您還未與服務器端建立連接,請檢查服務器是否啓動')
return
self.buffer = 1024
self.clientSock.send('Y'.encode())
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:
continue
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.serverMsg)
else:
break
except EOFError as msg:
raise msg
self.clientSock.close()
break
def sendMessage(self):
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:
self.chatText.insert(tkinter.END, '您還未與服務器端建立連接, 服務器端無法收到您的消息\n')
self.inputText.delete(0.0, message.__len__()-1.0)
def close(self):
sys.exit()
def startNewThread(self):
thread = threading.Thread(target=self.receiveMessage, args = ())
thread.setDaemon(True)
thread.start()
def main2():
client = ClientUI()
client.startNewThread()
client.root.mainloop()