udp 聊天室

编程入门 行业动态 更新时间:2024-10-04 23:27:38

udp <a href=https://www.elefans.com/category/jswz/34/1768704.html style=聊天室"/>

udp 聊天室

---
title: udp聊天室
date: 2018-09-27 21:32:41
tags: udp聊天室
---#服务器程序import socketimport selectimport sys,os"""接收普通聊天消息"""s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)PORT = 9527s.bind(("127.0.0.1",PORT))#os.system('python3 myserver2.py %s'%PORT)enrc = "^^^^"addrlist = []namelist = []wilfgamename = [[]]  #[[1,2,3,4,5,6,7,8,9,10],[a,b,c,d,e,f,g,h,i,j]]wilfgameaddr = [[]] # data = "welcome %s to join us"gamecount = 0 #游戏桌数量,默认从0开始playerNO = 12while True:# print(addrlist)# print(namelist)#recvfrom接收UDP消息,参数是每次接收消息的大小,返回接收到的内容print('waiting for recv')data,address = s.recvfrom(1024).decode()print(data)if '加入狼人杀' in data:name = data.decode().split(enrc)[0]wilfgamename[gamecount].append(name)wilfgameaddr[gamecount].append(address)if len(wilfgamename[gamecount]) >= playerNO:addrall = ''for x in wilfgameaddr[gamecount]:addrall += x[1] #取端口号addrall += '!!' #4653!!4653!!4655!!PORT += 1for x in wilfgameaddr[gamecount]:s.sendto('begin wolf kill!!!!%s'%PORT,x)os.system('python3 myserver2.py %s %s %s'%(PORT,'``'.join(wilfgamename[gamecount]),addrall))gamecount += 1wilfgamename.append(list())wilfgameaddr.append(list())elif '取消狼人杀' in data:name = data.decode().split(enrc)[0]wilfgamename[gamecount].remove(name)wilfgameaddr[gamecount].remove(address)# s.sendto(data,address)# s.sendto(b'server recv your msg',address)if enrc in data.decode():name = data.decode().split(enrc)[0]# print("name:",name)if data.decode().endswith("quit"): addrlist.remove(address)namelist.remove(name)  for i in range(len(addrlist)):s.sendto((name+" quit").encode(),addrlist[i])       else:if address in addrlist:passelse:addrlist.append(address)namelist.append(name)for x in addrlist:s.sendto(data,x)time.sleep(1)for x in addrlist:s.sendto(data,x)s.close()#客户端程序	from multiprocessing import Process,Queuefrom tkinter import Frame,Text,END,Scrollbarimport socketimport osimport timefrom tkinter import *import tkinter.messageboximport random import threadingfrom multiprocessing import Process,Queuefrom tkinter import scrolledtextname = sys.argv[1]q = Queue()s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)class GuiPart():def __init__(self,master,queue,endCommand,enrc='^^^^',HOST = "127.0.0.1",PORT = 9527):self.queue=queueself.enrc = enrcself.HOST = HOSTself.PORT = PORTself.playstatus = Trueself.var = StringVar()self.var.set('停止')self.wolfstatus = Trueself.wolf = StringVar()self.wolf.set('加入狼人杀')self.isgaming = False# data = self.name + self.enrc# self.s.sendto(data.encode("utf-8"),(self.HOST,self.PORT))#第一列self.frmA1 = Frame(width=180, height=30)self.frmA2 = Frame(width=180, height=280)self.frmA3 = Frame(width=180, height=160) self.frmA4 = Frame(width=180, height=30) #第二列self.frmB1 = Frame(width=350, height=326)self.frmB2 = Frame(width=350, height=144)self.frmB3 = Frame(width=350, height=30)#第三列self.frmC1 = Frame(width=200, height=30)self.frmC11= Frame(width=200, height=350)self.frmC2 = Frame(width=200, height=90)self.frmC3 = Frame(width=200, height=30)self.frmA1.grid(row=0, column=0, padx=10, pady=3)self.frmA2.grid(row=1, column=0, padx=10)self.frmA3.grid(row=2, column=0, rowspan=1)self.frmA4.grid(row=3, column=0, rowspan=1)self.frmB1.grid(row=0, column=1, columnspan=1, rowspan=2, padx=1, pady=3)self.frmB2.grid(row=2, column=1, columnspan=1, padx=1, pady=1)self.frmB3.grid(row=3, column=1, columnspan=1, padx=1)self.frmC1.grid(row=0, column=2, rowspan=1, padx=1, pady=1)self.frmC11.grid(row=1, column=2, rowspan=1, padx=1, pady=1)  self.frmC2.grid(row=2, column=2, rowspan=1, padx=1, pady=1)self.frmC3.grid(row=3, column=2, padx=1)# #固定大小self.frmA1.grid_propagate(0)self.frmA2.grid_propagate(0)self.frmA3.grid_propagate(0)#frmA4.grid_propagate(0)self.frmB1.grid_propagate(0)self.frmB2.grid_propagate(0)self.frmB3.grid_propagate(0)self.frmC1.grid_propagate(0)self.frmC11.grid_propagate(0)  self.frmC2.grid_propagate(0)self.frmC3.grid_propagate(0)#1.Text控件self.txtMsgList = scrolledtext.ScrolledText(self.frmB1,wrap=tkinter.WORD)self.txtMsgList.config(state=DISABLED)#创建并配置标签tag属性# self.txtMsgList.tag_config('greencolor',foreground='#008C00')self.txtMsg = Text(self.frmB2);self.txtMsg.bind("<KeyPress-Return>", self.sendMsgEvent)    #事件绑定,定义快捷键self.timeText=Text(self.frmC2,font=("Times", "28", "bold italic"),height=1,bg="PowderBlue")self.timeText2=Text(self.frmC2,fg="blue",font=("Times", "12","bold italic"))self.txtText=Text(self.frmC11,font=("Times", "11",'bold'),  #字体控制width=24,height=15,                  #文本框的宽(in characters )和高(in lines) (not pixels!)spacing2=5,                          #文本的行间距bd=2,                                #边框宽度padx=5,pady=5,                       #距离文本框四边的距离selectbackground='blue',             #选中文本的颜色state=NORMAL)                        #文本框是否启用 NORMAL/DISABLEDself.txtText.insert(END,'aaa')self.txtText.config(state=DISABLED)# insert(插入位置,插入内容)#2.Button控件self.btnSend = Button(self.frmB3, textvariable=self.wolf, width = 8,cursor='heart', command=self.joinWolf)self.btnCancel = Button(self.frmB3, textvariable = self.var, width = 8,cursor='shuttle', command=self.StopPlay)self.btnSerch=Button(self.frmA1, text='搜索联系人',         #button的显示内容width = 9,height=1,               #宽和高cursor='man',                     #光标样式     command =self.message)                 #回调函数#3.Entry控件self.entrySerch=Entry(self.frmA1, bd =3,width=14) # entrySerch=Entry(frmA1, bd =3,width=14,show='*')   #输入值以掩码显示    #4.Scrollbar控件self.scroLianxi = Scrollbar(self.frmA2,width=22,cursor='pirate',troughcolor="blue") #5.Listbox控件self.listLianxi = Listbox(self.frmA2, width=22,height=16,yscrollcommand = self.scroLianxi.set )  #连接listbox 到 vertical scrollbarself.Linkman=['曹操','刘备','孙权','关羽','张飞','赵云','马超','黄忠','张郃','姜维','夏侯惇','魏延','张辽','周瑜','贾诩','典韦','吕布','袁绍','袁术','貂蝉','董卓','华佗','诸葛亮','郭嘉','孙策','孙坚','太史慈','鲁肃','黄盖','程普','程昱','司马懿','曹丕','曹植','曹睿']for line in self.Linkman:self.listLianxi.insert(END, "  联系人   ------   " + str(line))self.scroLianxi.config( command = self.listLianxi.yview )   #scrollbar滚动时listbox同时滚动#6.Canvas控件self.imgCanvas=Canvas(self.frmA3,bg='ivory')#7.Radiobutton控件var = IntVar()                                    #设置variable和value可以保证只有一个按钮被按下self.R1 = Radiobutton(self.frmA4, text="2048", variable=var, value=1,command=self.TwoPow11)self.R2 = Radiobutton(self.frmA4, text="椭圆", variable=var, value=2,command=self.Oval)#8.Menubutton控件self.colorMenubt =  Menubutton (self.frmA4, text="画板颜色", relief=RAISED )#9.Menu控件self.colorMenubt.menu  =  Menu(self.colorMenubt,tearoff = 0 )self.colorMenubt["menu"]  = self.colorMenubt.menuself.colorMenubt.menu.add_checkbutton ( label="红色",command=self.red)self.colorMenubt.menu.add_checkbutton ( label="绿色",command=self.green)self.colorMenubt.menu.add_checkbutton ( label="蓝色",command=self.blue)self.colorMenubt.menu.add_separator()       #添加菜单分隔符self.colorMenubt.menu.add_checkbutton ( label="连续色",command=self.color1)#10.Scale控件self.sizeScale = Scale(self.frmC3,length=135,width=18,from_=10, to=35,orient=HORIZONTAL,command=self.fontSize,cursor='star',showvalue=0,         #不显示数值sliderlength=30,     #滑块的长度             troughcolor='ivory') #滑动条底色self.sizeScale.set(20)                      #设置滑块的初始值#11.Label控件self.sizeLabel = Label(self.frmC3,width=8,height=1,bd=1, relief=RIDGE)self.nameLabel = Label(self.frmC1, text='Favorite Book List',font="Times 16 bold italic")#12.Spinbox控件self.txtSpinbox = Spinbox(self.frmC11,width=24,command=self.txtlist)self.txtSpinbox.config(values=['NO.1 《平凡的世界》  路遥','NO.2 《看见》  柴静','NO.3 《亲爱的安德烈》龙应台'])# self.txtSpinbox.config(state=DISABLED)self.btnSend.grid(row=0, column=0)self.btnCancel.grid(row=0, column=1)self.btnSerch.grid(row=0,column=1)self.nameLabel.grid()self.sizeLabel.grid(row=0,column=0)self.txtMsgList.grid()self.txtMsg.grid()self.entrySerch.grid(row=0,column=0)self.scroLianxi.grid(row=0,column=1,ipady=120)self.listLianxi.grid(row=0,column=0)self.imgCanvas.grid(row=0,column=0,sticky=N)self.colorMenubt.grid(row=0,column=0)self.R1.grid(row=0,column=1) self.R2.grid(row=0,column=2)self.timeText.grid(row=0,column=0)self.timeText2.grid(row=1,column=0,sticky=E+W)self.txtText.grid(row=1,column=0,pady=5)self.sizeScale.grid(row=0,column=1)self.txtSpinbox.grid(row=0,column=0)# name = input("input your name\t")self.name = nameself.strMsg = self.name + time.ctime() + '\n 'def sendMsg2Server(self):self.strMsg = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) + '\n 'info = self.txtMsg.get('0.0', END)info = info.strip()print('send msg: ',info)if info =='quit':s.sendto((self.name+ self.enrc+"quit").encode("utf-8"),(self.HOST,self.PORT))# breakelse:data = self.name + self.enrc + info s.sendto(data.encode("utf-8"),(self.HOST,self.PORT))self.txtMsg.delete('0.0', END)def sendMsg(self):#发送消息self.sendMsg2Server()def joinWolf(self):if not self.isgaming:self.wolfstatus = self.wolfstatus ^ Trueif not self.wolfstatus:self.wolf.set('取消狼人杀')s.sendto(name+enrc+'加入狼人杀'.encode("utf-8"),(self.HOST,self.PORT))else:self.wolf.set('加入狼人杀')s.sendto(name+enrc+'取消狼人杀'.encode("utf-8"),(self.HOST,self.PORT))else:self.wolf.set('正在狼人杀')def StopPlay(self):pass# self.playstatus = self.playstatus ^ True# if not self.playstatus:# pygame.mixer.music.stop()# self.var.set('播放')# else:# pygame.mixer.music.load('./sound/sound2.mp3')# pygame.mixer.music.play(-1,0.0)# self.var.set('停止')def sendMsgEvent(self,event):        #发送消息事件if event.keysym == "Return":  #按回车键可发送self.sendMsg()def red(self): #Canvas背景色控制self.imgCanvas.config(bg='red')def green(self):self.imgCanvas.config(bg='green')def blue(self):self.imgCanvas.config(bg='blue')def color1(self):names = ['red', 'green', 'blue','yellow','white','SlateGray','SpringGreen','LightSteelBlue','Cyan','BlueViolet','GhostWhite']for i in names:self.imgCanvas.config(bg=i)time.sleep(0.4)self.imgCanvas.update()def Oval(self): #这里要换成按钮self.imgCanvas.create_oval(110, 20, 170, 120)def TwoPow11(self): #这里要换成按钮pass# pygame.mixer.music.pause() # if sys.version >= '3':# os.system("python3 ./test2048.py")# else:# os.system("python ./test2048.py")# pygame.mixer.music.load('./sound/sound2.mp3')# pygame.mixer.music.unpause()# pygame.mixer.music.play(-1,0.0)# self.imgCanvas.create_TwoPow11(20, 20, 110, 50,100,110,40,120)def fontSize(self,ev=None):          #字体缩放self.timeText2.config(font='Helvetica -%d bold' % self.sizeScale.get())self.sizeLabel.config(text='字号:%d'% self.sizeScale.get())def txtlist(self):                  #字典实现--书名与内容的对应book={'NO.1 chapter1','NO.2 chapter2','NO.3 chapter3'}self.txtText.config(state=NORMAL)self.txtText.delete(0.0,END)self.txtText.insert(END,book[self.txtSpinbox.get()])self.txtText.config(state=DISABLED)def message(self):                  #弹出窗口tkinter.messagebox.showinfo("联系人搜索","这是一个假的功能!!")def mainevent(self): if self.recvdmsg :self.txtMsgList.insert(END, data, 'greencolor')def processIncoming(self):# pygame.init()self.strMsg = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) + '\n 'while self.queue.qsize():try:msgall=self.queue.get(0)self.txtMsgList.config(state=NORMAL)   #设置消息栏可以编辑             self.txtMsgList.insert(END, self.strMsg, 'greencolor')self.txtMsgList.insert(END, str(msgall)+'\n', 'greencolor')self.txtMsgList.see('end')self.txtMsgList.config(state=DISABLED)#设置消息栏不可以编辑 except :passclass ThreadedClient():def __init__(self,master):self.master=masterself.queue=Queue()self.gui=GuiPart(master,self.queue,self.endApplication)self.running=Trueself.periodicCall()self.thread1=Process(target=self.workerThread1)self.thread1.start()def __del__(self):pass# self.thread1.join()def periodicCall(self):self.master.after(200,self.periodicCall)self.gui.processIncoming()if not self.running:self.master.destroy()def workerThread1(self):#self.ott=Tkinter.Tk()#self.ott.mainloop()# self.s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# self.s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)while self.running:data,addr = s.recvfrom(1024)self.queue.put(data.decode())def endApplication(self):self.running=Falseif __name__ == "__main__":root=tkinter.Tk()root.title('无畏造英雄')client=ThreadedClient(root)root.mainloop()

 

更多推荐

udp 聊天室

本文发布于:2024-02-28 07:40:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1768719.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:聊天室   udp

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!