udp 聊天室

---
title: udp聊天室
date: 2018-09-27 21:32:41
tags: udp聊天室
---

#服务器程序

		import socket
		import select
		import sys,os
		"""接收普通聊天消息"""
		s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
		s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
		PORT = 9527
		s.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 = 12
		while 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 += 1
					for 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 += 1
					wilfgamename.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:
						pass
					else:
						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,Queue
		from tkinter import Frame,Text,END,Scrollbar
		import socket
		import os
		import time
		from tkinter import *
		import tkinter.messagebox
		import random 
		import threading
		from multiprocessing import Process,Queue
		from tkinter import scrolledtext


		name = 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=queue
				self.enrc = enrc
				self.HOST = HOST
				self.PORT = PORT
				self.playstatus = True
				self.var = StringVar()
				self.var.set('停止')
				self.wolfstatus = True
				self.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/DISABLED
				self.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 scrollbar
				self.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.menu

				self.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 = name
				self.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))
					# break
				else:
					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 ^ True
					if 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 :
						pass

		class ThreadedClient():
			def __init__(self,master):

				self.master=master

				self.queue=Queue()
				self.gui=GuiPart(master,self.queue,self.endApplication)
				self.running=True
				self.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=False

		if __name__ == "__main__":
			root=tkinter.Tk()
			root.title('无畏造英雄')
			client=ThreadedClient(root)

			root.mainloop()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值