




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
基于TCP協議?上聊天程序(python)帶界?基于TCP協議?上聊天程序(python)帶界?1設計?標基于TCP協議?上聊天程序實現?簡單的聊天程序實現?上聊天,包括服務器和客戶端。(1)?持多?聊天;(2)客戶端具有圖形化?戶界?;(3)客戶端之間具有群發和私聊的功能。2?python實現的TCP通信模型TCP客戶端:通過connect((ip,port))來請求連接,send()進?發送消息,recv()進?接受消息。TCP服務器:通過bind((ip,port))綁定ip和端?,ip不寫則代表默認本機所有地址,listen()控制客服端的連接數量,accept()等待阻塞,?直到客戶端的到來,recv()接受消息,send()發送消息。具體過程如下:3實現了簡單的TCP聊天程序實現?上聊天,通過對服務器和端?的輸?,可以在不同的主機上運?并將其服務器與客戶端連接,?多線程可以?持多?同時聊天,客戶端具有圖形化?戶界?,客戶端之間具有群發和私聊的功能并且能知道實時的?戶在線名單,界?顯?效果良好,整體完成效果良好。客戶端client:#-*-coding:utf-8-*-"""CreatedonTueMay1223:49:202020@author:LENOVO"""importtkinterimportsocketimportthreadingimporttimewin=tkinter.Tk()win.title("客戶端")win.geometry("400x300+300+200")ck=NonedefgetInfo():whileTrue:data=ck.recv(1024)#?于接受服務其發送的信息#接收消息時同步獲取系統時間并顯?在消息顯?框上text.insert(tkinter.INSERT,time.strftime('%Y-%m-%d%H:%M:%S',time.localtime())+'\n')text.insert(tkinter.INSERT,data.decode("utf-8"))defconnectServer():globalck#全局ipStr=eip.get()portStr=eport.get()userStr=euser.get()client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#socked所準守ipv4相關協議client.connect((ipStr,int(portStr)))#連接服務器client.send(userStr.encode("utf-8"))#將??的登錄名發送給服務器,函數會附帶??的IP信息ck=clientt=threading.Thread(target=getInfo)t.start()defsendMail():friend=Nonefriend=Nonefriend=efriend.get()sendStr=esend.get()#??發出的消息服務器不會重發會給??,所以在客戶端定義界?顯???發送的消息iffriend!="":text.insert(tkinter.INSERT,time.strftime('%Y-%m-%d%H:%M:%S',time.localtime())+'\n'+'我對'+friend+'說:'+sendStr+'\n')else:text.insert(tkinter.INSERT,time.strftime('%Y-%m-%d%H:%M:%S',time.localtime())+'\n'+'我(群發)說:'+sendStr+'\n')#將消息發給服務器,添加“:”分割是要?便服務器端?正則表達式分出要發送的?戶名和要發送的消息sendStr=friend+":"+sendStr+"\n"ck.send(sendStr.encode("utf-8"))defExit():#我在服務器端定義了接收到“exit”就判定該?戶下線,并刪掉該?戶的資料sendStr="exit"+":"+""ck.send(sendStr.encode("utf-8"))text.insert(tkinter.INSERT,"您已下線,如需接收信息請重新登錄。\n")#下?是界?labelUse=tkinter.Label(win,text="userName").grid(row=0,column=0)euser=tkinter.Variable()entryUser=tkinter.Entry(win,textvariable=euser).grid(row=0,column=1)labelIp=tkinter.Label(win,text="服務器ip").grid(row=1,column=0)eip=tkinter.Variable()entryIp=tkinter.Entry(win,textvariable=eip).grid(row=1,column=1)labelPort=tkinter.Label(win,text="port").grid(row=2,column=0)eport=tkinter.Variable()entryPort=tkinter.Entry(win,textvariable=eport).grid(row=2,column=1)button=tkinter.Button(win,text="登錄",command=connectServer).grid(row=0,column=2)text=tkinter.Text(win,height=10,width=40)labeltext=tkinter.Label(win,text="顯?消息").grid(row=4,column=0)text.grid(row=4,column=1)esend=tkinter.Variable()labelesend=tkinter.Label(win,text="發送的消息").grid(row=5,column=0)entrySend=tkinter.Entry(win,textvariable=esend).grid(row=5,column=1)efriend=tkinter.Variable()labelefriend=tkinter.Label(win,text="發給誰").grid(row=6,column=0)entryFriend=tkinter.Entry(win,textvariable=efriend).grid(row=6,column=1)button2=tkinter.Button(win,text="發送",command=sendMail).grid(row=6,column=2)button2=tkinter.Button(win,text="下線",command=Exit).grid(row=2,column=2)win.mainloop()服務器server:#-*-coding:utf-8-*-"""CreatedonTueMay1223:46:032020@author:LENOVO"""importtkinterimportsocket,threadingwin=tkinter.Tk()#創建主窗?win.title('服務器')win.geometry("400x300+200+20")users={}#?戶字典,也可以連接數據庫defrun(connect,addrss):#接收客戶端登陸的信息userName=connect.recv(1024)#解碼并儲存?戶的信息users[userName.decode("utf-8")]=connect#在連接顯?框中顯?是否連接成功printStr=""+userName.decode("utf-8")+"連接\n"text.insert(tkinter.INSERT,printStr)#向當前登錄的客戶端反饋登錄信息并提供在線?戶列表printStr="登錄成功!\n"+"當前在線的好友有:"+str(list(users.keys()))+"\n"connect.send(printStr.encode())#向所有在線的客戶端反饋新的好友登錄信息并提供在線?戶列表printStr=userName.decode("utf-8")+"已上線\n"+"當前在線的好友有:"+str(list(users.keys()))+"\n"forkeyinusers:ifkey!=userName.decode("utf-8"):users[key].send(printStr.encode())#接受客戶端發送的信息whileTrue:rData=connect.recv(1024)dataStr=rData.decode("utf-8")#分割字符串得到所要發送的?戶名和客戶端所發送的信息infolist=dataStr.split(":")#通過客戶端要發送的信息中是否指定要發送到的?戶,如果沒有選擇要發送的?戶,則默認為群發消息ifinfolist[0]=="":forkeyinusers:ifkey!=userName.decode("utf-8"):users[key].send((userName.decode("utf-8")+"說(群發):"+infolist[1]).encode("utf"))#如果接收到的消息為客戶端退出函數發送的“exit”則刪掉該?戶在users字典中的信息,并通知其他?戶該?戶已下線elifinfolist[0]=="exit":delusers[userName.decode("utf-8")]#刪掉該?戶信息printStr=""+userName.decode("utf-8")+"下線\n"text.insert(tkinter.INSERT,printStr)forkeyinusers:printStr=userName.decode("utf-8")+"已下線\n"+"當前在線的好友有:"+str(list(users.keys()))+"\n"users[key].send(printStr.encode())#要發送信息的客戶端向?標客戶端發送信息else:ifinfolist[0]inusers:users[infolist[0]].send((userName.decode("utf-8")+"說(私聊):"+infolist[1]).encode("utf"))else:printStr=infolist[0]+"不在線,上條消息未發出"+"\n"connect.send(printStr.encode())#界?啟動按鈕連接的函數defstartSever():#啟??個線程開啟服務器s=threading.Thread(target=start)s.start()#開啟線程defstart():#從輸?端中獲取ip和端?號ipStr=eip.get()portStr=eport.get()#socket嵌套字TCP的ipv4和相關協議server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#綁定ip和端?號server.bind((ipStr,int(portStr)))server.bind((ipStr,int(portStr)))#設置監聽和連接的最?的數量server.listen(10)#服務器啟動信息顯?在信息窗?中printStr="服務器啟動成功!\n"text.insert(tkinter.INSERT,printStr)#模擬服務器要?直運?所以使?死循環whileTrue:#接受所連接的客戶端的信息connect,addrss=server.accept()#每連接?個客戶端就開啟?個線程t=threading.Thread(target=run,args=(connect,addrss))t.start()#下?是關于界?的操作labelIp=tkinter.Label(win,text='ip').grid(row=0,column=0)eip=tkinter.Variable()labelPort=tkinter.Label(win,text='port').grid(row=1,column=0)eport=tkinter.Variable()entryIp=tkinter.Entry(win,textvariable=eip).grid(row=0,column=1)entryPort=tkinter.Entry(win,text
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度浙江省二級造價工程師之建設工程造價管理基礎知識通關試題庫(有答案)
- 心理健康疏導課件
- 腫瘤標志物的臨床意義
- 正常孩子的日常護理
- 反恐安全意識培訓教材
- 校園防火安全教育
- 高考物理核心考點考前沖刺 勻變速直線運動位移與時間的關系(含解析)
- 幼兒園小班數學《小幫手》課件
- 幼兒園小班美術教案《花被子》
- 消防急救技能培訓
- 2025冬季四川成都湔江投資集團限公司招聘32人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年全國保密教育線上培訓考試試題庫帶答案(典型題)含答案詳解
- 甘肅蘭州2025年公開招聘農村(村務)工作者筆試題帶答案分析
- 大健康項目商業計劃書
- AI賦能與素養導向:初中英語智慧課堂的融合實踐研究
- 《2025年危險化學品企業安全生產執法檢查重點事項指導目錄》解讀與培訓
- 2025全國交通運輸行業職業技能競賽學生組技術方案
- 常用儀表使用方法鐵道信號綜合實訓課件
- 2025云南黃金礦業集團股份限公司招聘114人易考易錯模擬試題(共500題)試卷后附參考答案
- 預防職務犯罪交流課件
- 2025年初一下冊語文-課內現代文復習18課.《井岡翠竹》(教師版)
評論
0/150
提交評論