基于TCP的在線聊天程序

在線聊天服務端

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

?

?

轉載于:https://www.cnblogs.com/jzxs/p/11166180.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386423.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker安裝Confluence

Docker安裝Confluence 參考鏈接: https://my.oschina.net/u/2289161/blog/1648587 https://hub.docker.com/r/cptactionhank/atlassian-confluence/dockerfile https://my.oschina.net/u/2289161/blog/1647061 https://my.oschina.net/u/2289161/blog/838218 https://hub.…

安卓開發基礎面試題,Android面試必備的集合源碼詳解,附小技巧

去年無疑是 Flutter 技術如火如荼發展的一年。 每一個移動開發者都在為 Flutter 帶來的“快速開發、富有表現力和靈活的 UI、原生性能”的特色和理念而癡狂,從超級 App 到獨立應用,從純 Flutter 到混合棧,開發者們在不同的場景下樂此不疲的探…

『算法』讀書筆記 1.4算法分析 Part1

Chapter 1 本章結構 1.1Java語法 1.2數據抽象 1.3集合類抽象數據類型:背包 (Bags) 、隊列 (Queues) 、棧 (Stacks) 1.4算法分析 1.5連通性問題-Case Study: Union - Find ADT 本節開篇使用了一個ThreeSum程序進行示例: ThreeSum所起到的作用…

JS調用MetaMask調用啟動轉賬

1 、代碼必須跑在nginx下,否則沒有eth對象。 2、可以下載ganache來單跑個私服,然后安裝谷歌metamask瀏覽器插件來實驗 3、賬戶1:0xFA387e41FA471172cC729167EBD4862aA7020D91 賬戶2:0x818DF62ff0bE3B28AE8be25e2e848E10138018B7 4、1000000000000000 …

安卓開發工程師面試題!春招我借這份PDF的復習思路,不吃透都對不起自己

寫在前面 身邊有不少去大廠面試的朋友,其中小金面試字節跳動的經歷很有意義,在這里分享給大家。小金是末流211計算機專業大三本科生,前幾天面試了字節跳動的廣州Android開發實習生。下面是他的面試經歷,還有一些他自己的經驗。 …

合算的日本料理

巨鹿路和那個茂名路路口的《和味》,有預訂的話才98一個人,味道不錯,樓上的桃子MM服務狠好,笑容狠甜。那里的東西味道還是狠正宗的,除了一個色拉不對。那里的清酒和梅酒都不錯,尤其梅酒。生牛肉雖然沒有大漁…

安卓開發必須會的技能!淺談Android消息機制原理,威力加強版

目錄 想要成為一名優秀的Android開發,你需要一份完備的知識體系,在這里,讓我們一起成長為自己所想的那樣。 PagerAdapter 介紹ViwePager 緩存策略ViewPager 布局處理ViewPager 事件處理相關內容 Android 基礎 1.Activity 1、 什么是 Activi…

NuGet 無法連接到遠程服務器-解決方法(轉)

原地址: http://www.lixin.me/blog/2012/03/01/29362 今天打開NuGet的Manage NuGet Packages,顯示“無法連接到遠程服務器”。打開Setting-》Package Manager-》Package Sources。看到里面有一個源:https://go.microsoft.com/fwlink/?LinkID…

安卓開發面試書籍,全世界都在問Android開發涼了嗎?建議收藏

前言 本想今年辭掉工作大干一場,沒想到碰到疫情,家里蹲了3個月…,還好字節能給一次機會。前陣子字節跳動的提前批開始了,看宣傳是說有海量HC,機會多多,本著漲漲面經的心理,然后就投遞了一下杭州…

杭州集訓Day5

下面是Day5的題目!(其實都咕了好幾天了 1007040210. T1 皇后 XY 的疑難 (1s 512MB) 1.1 題目描述有一個n*n的王國城堡地圖上,皇后XY喜歡看騎士之間的戰斗,于是他準備布置m個騎士,其中每一個騎士都可以向8個方向&#x…

安卓開發面試書籍,每個程序員都必須掌握的8種數據結構!面試必會

前言 本篇文章主要記錄分享我的面試準備過程。 很多朋友問我為什么離職 關于離職原因,馬云有一句經典的話“要么錢沒給到位,要么心委屈了”,想必大家耳熟能詳了,我這里再細說一下我個人離職原因: 工資倒掛&#xf…

使用thinkPHP做注冊程序的實例

登錄界面&#xff1a; 數據庫和數據表的結構 具體的操作步驟如下&#xff1a; 第一步&#xff1a;入口文件index.php內容 (此文件基本是屬于固定的格式&#xff09; <?phpdefine(THINK_PATH,./ThinkPHP/);define(APP_NAME,MyApp);define(APP_PAHT,./MyApp/);require_once T…

安卓開發面試技能介紹,來一份全面的面試寶典練練手,不吃透都對不起自己

前言 網上有很多對程序員簡歷的一些指導&#xff0c;這里就不重述&#xff0c;大家可以搜下網上其他大神的總結&#xff0c;結合自身情況修改下。我有幾點建議&#xff1a; 1.盡量不要花哨&#xff0c;程序員和設計師或者產品運營還不一樣&#xff0c;我們的簡歷成功與否決定…

上交所行情文件導入數據庫

事情的起因很簡單&#xff0c;需要將股票收盤行情導入數據庫&#xff0c;因為科創板交易時間延長&#xff0c;需要將原有的程序進行改造&#xff0c;眾所周知&#xff0c;程序員永遠是不夠用的&#xff0c;只能自己解決這個問題。 方式是用定時器調用shell腳本。 上交所的mktdt…

安卓開發面試題及答案,一次嗶哩嗶哩面試經歷,年薪50W

沒有穩定的工作&#xff0c;只有穩定的能力。 又到了萬物復蘇的季節&#xff0c;在程序猿這個行當里&#xff0c;作為 Android 開發出生的&#xff0c;在經歷了八年的脫發生涯后&#xff0c;有了越來越多的想法和感觸 趨勢 隨著各類移動跨平臺的興起&#xff0c;在 ReactNati…

Intent 簡單用法

1.Intent有什么用&#xff1f; Android設計理念是鼓勵減少組件間的耦合&#xff0c;因此Android提供了Intent (意圖) &#xff0c;Intent是一種消息傳遞機制&#xff0c;可以在程序內使用&#xff0c;也可以在程序間使用&#xff0c;主要用于啟動“Activity”“Service”和“廣…

安卓開發面試題!帶著問題深入學習Handler,進階學習資料!

進大廠本來就很難了&#xff0c;不過做足了準備&#xff0c;你會發現很多問題都迎刃而解了&#xff0c;當然有時候運氣也占了一部分&#xff0c;除了運氣以外&#xff0c;當然與我自身的努力也是分不開的。運氣也是實力的一部分&#xff0c;畢竟天助自助者~ 每次到年底做總結的…

VueJS教程3

目錄 13、Vue實例 13.1 動態組件&#xff08;Tab切換、簡化版留言板&#xff09;13.2 使用Vue開發TodoList14、Vue CLI14.1 使用vue-cli開發TodoList接著VueJS教程2。 13、Vue實例 13.1 動態組件&#xff08;Tab切換、簡化版留言板&#xff09; 參考&#xff1a;https://vuejs.…

春招我借這份PDF的復習思路,論程序員成長的正確姿勢

一. 開發背景 想要成為一名優秀的Android開發&#xff0c;你需要一份完備的知識體系&#xff0c;在這里&#xff0c;讓我們一起成長為自己所想的那樣。 面試總結 面試大廠一定要做好充分的準備&#xff0c;沒有準備就去面試完全是去當炮灰的&#xff0c;更是對自己的不負責。再…

T-SQL語句學習(三)

這部分介紹下視圖、索引技術。 1、視圖&#xff1a;是從一個或幾個基本表&#xff08;或視圖&#xff09;導出表。視圖與基本表不同&#xff0c;是一個虛表。 當基本表中的數據發生變化時&#xff0c;從視圖中查詢出來的數據也會隨之改變。 1.1 定義視圖 a、創建視圖的語法要求…