jzxs

在线聊天服务端

import tkinter
import tkinter.font as tkFont
import socket
import threading
import time
import sys
class ServerUI():
    local=\'127.0.0.1\'
    port=5505
    global serverSock;
    flag=False

    def __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.set
        self.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.set
        self.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=1024
        self.chatText.insert(tkinter.END ,\'服务器已经就绪 ......\')
            #循环接受客户端的连接请求
            
        while True:
            self.connection,self.address=self.serverSock.accept()
            self.flag=True
            while True :
            #接收客户端发送的消息
                self.cientMsg=self.connection.recv(self.buffer).decode(\'utf-8\')
                if not self.cientMsg:
                    continue
                elif 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=5505
    global 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.set
        self.chatText.pack(expand=1,fill=tkinter.BOTH)
        self.chatTextScrollBar[\'command\']=self.chatText.yview()
        self.frame[0].pack(expand=1,fill=tkinter.BOTH)
        #标签,分开消息显示Text和消息输入Text
        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.set
        self.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=True
        except:
            self.flag=False
            self.chatText.insert(tkinter.END,\'您还未与客户端建立连接,请检查服务器是否启动......\')
            return
    
        self.buffer=1024
        self.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:
                        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) :
    #得到用户在 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()

 

 

分类:

技术点:

相关文章: