當(dāng)前位置:
首頁(yè) >
基于TCP的在线聊天程序
發(fā)布時(shí)間:2023/11/30
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
基于TCP的在线聊天程序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在線聊天服務(wù)端
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('在線聊天-服務(wù)端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的滾動(dòng)條self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#輸入消息并與滾動(dòng)條綁定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)#發(fā)送按鈕self.sendButton=tkinter.Button(self.frame[3],text='發(fā)送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#關(guān)閉按鈕self.closeButton=tkinter.Button(self.frame[3],text='關(guān)閉', 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 ,'服務(wù)器已經(jīng)就緒 ......')#循環(huán)接受客戶端的連接請(qǐng)求while True:self.connection,self.address=self.serverSock.accept()self.flag=Truewhile True :#接收客戶端發(fā)送的消息self.cientMsg=self.connection.recv(self.buffer).decode('utf-8')if not self.cientMsg:continueelif self.cientMsg=='Y':self.chatText.insert(tkinter.END ,'服務(wù)器端己經(jīng)與客戶端建立連接 .....')self.connection.send(b'Y')elif self.cientMsg=='N':self.chatText.insert(tkinter.END ,'服務(wù)器端與客戶端建立連接失敗 .....')self.connection.send(b'N')else :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'客戶端'+ theTime +'說(shuō): \n')self.chatText.insert(tkinter.END ,' '+ self.cientMsg)#發(fā)送消息def sendMessage(self):#得到用戶在 Text 中輸入的消息message=self.inputText.get ('1.0',tkinter.END)#格式化當(dāng)前的時(shí)間theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服務(wù)器' + theTime + '說(shuō): \n')self.chatText.insert(tkinter.END,' '+message +'\n')if self.flag==True :#將消息發(fā)送到客戶端 self.connection.send(message.encode())else:#Socket 連接沒(méi)有建立,提示用戶self.chatText.insert(tkinter.END,'您還未與客戶端建立連接,客戶端無(wú)法接收你的消息\n')#清空用戶在Text中輸入的消息self.inputText.delete(0.0,message.__len__()-1.0)#關(guān)閉消息窗口并退出def close(self):sys.exit()#啟動(dòng)線程接收客戶端的消息def startNewThread(self) :#啟動(dòng)一個(gè)新線程來(lái)接收客戶端的消息#args是傳遞給線程函數(shù)的參數(shù) receiveMessage 函數(shù)不需要參數(shù),只傳一個(gè)空元組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#初始化類的相關(guān)屬性的構(gòu)造函數(shù)def __init__(self):self.root=tkinter.Tk()self.root.title('在線聊天-客戶端v1.0')#窗口面板,用四個(gè)面板布局self.frame=[tkinter.Frame(),tkinter.Frame(),tkinter.Frame(),tkinter.Frame()]#顯示消息Text右邊的滾動(dòng)條self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#顯示消息Text,并綁定上面的滾動(dòng)條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)#標(biāo)簽,分開(kāi)消息顯示Text和消息輸入Textlabel=tkinter.Label(self.frame[1],height=2)label.pack(fill=tkinter.BOTH)self.frame[1].pack(expand=1,fill=tkinter.BOTH)#輸入消息text的滾動(dòng)條self.inputTextScorllBar=tkinter.Scrollbar(self.frame[2])self.inputTextScorllBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)#輸入消息并與滾動(dòng)條綁定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)#發(fā)送按鈕self.sendButton=tkinter.Button(self.frame[3],text='發(fā)送',width=10,command=self.sendMessage)self.sendButton.pack(expand=1,side=tkinter.BOTTOM and tkinter.RIGHT,padx=25,pady=5)#關(guān)閉按鈕self.closeButton=tkinter.Button(self.frame[3],text='關(guān)閉', 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,'您還未與客戶端建立連接,請(qǐng)檢查服務(wù)器是否啟動(dòng)......')returnself.buffer=1024self.clientSock.send('Y'.encode())#向服務(wù)器發(fā)送字符'Y',表示客戶端要連接服務(wù)器while True:try:if self.flag==True:#連接建立,接受服務(wù)器端消息self.serverMsg=self.clientSock.recv(self.buffer).decode('utf-8')if self.serverMsg=='Y':self.chatText.insert(tkinter.END ,'客戶端己經(jīng)與服務(wù)端建立連接 .....')elif self.serverMsg=='N':self.chatText.insert(tkinter.END ,'客戶端端與服務(wù)端建立連接失敗 .....')elif not self.serverMsg:continueelse :theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END ,'服務(wù)端' + theTime + '說(shuō): \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)#格式化當(dāng)前的時(shí)間theTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())self.chatText.insert(tkinter.END,'客戶端'+ theTime +'說(shuō): \n')self.chatText.insert(tkinter.END,' '+message+'\n')if self.flag==True:#將消息發(fā)送到服務(wù)端 self.clientSock.send(message.encode())else:#Socket 連接沒(méi)有建立,提示用戶self.chatText.insert(tkinter.END,'您還未與服務(wù)端建立連接,客戶端無(wú)法接收你的消息\n')#清空用戶在Text中輸入的消息self.inputText.delete(0.0,message.__len__()-1.0)#關(guān)閉消息窗口并退出def close(self):sys.exit()#啟動(dòng)線程接收客戶端的消息def startNewThread(self) :#啟動(dòng)一個(gè)新線程來(lái)接收客戶端的消息#args是傳遞給線程函數(shù)的參數(shù)receiveMessage 函數(shù)不需要參數(shù),只傳一個(gè)空元組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()?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jzxs/p/11166180.html
總結(jié)
以上是生活随笔為你收集整理的基于TCP的在线聊天程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: s4这些机制会不会导致某些辅助除了去下路
- 下一篇: 光遇破碎季新地图怎么进入?