有没有办法限制Python聊天室应用程序中客户端每秒发送的消息数?
我正在为学校制作一个python聊天室应用程序,其中包含一个运行良好的客户端和服务器端脚本。我现在为聊天室添加了多种功能,使其更易于使用,其中之一就是垃圾邮件保护。是否有一种方法可以记录客户端在某一特定时间内发送的消息数量,如果超过最大值,则会在某一时间内静音 clientside.py:有没有办法限制Python聊天室应用程序中客户端每秒发送的消息数?,python,sockets,tkinter,spam-prevention,chatroom,Python,Sockets,Tkinter,Spam Prevention,Chatroom,我正在为学校制作一个python聊天室应用程序,其中包含一个运行良好的客户端和服务器端脚本。我现在为聊天室添加了多种功能,使其更易于使用,其中之一就是垃圾邮件保护。是否有一种方法可以记录客户端在某一特定时间内发送的消息数量,如果超过最大值,则会在某一时间内静音 clientside.py: from socket import AF_INET, socket, SOCK_STREAM from threading import Thread import tkinter as tkinter #
from socket import AF_INET, socket, SOCK_STREAM
from threading import Thread
import tkinter as tkinter
#import tkinter.ttk as ttk
#from ttkthemes import ThemedStyle
from tkinter import END
from datetime import *
import time as tme
def receive():
while True:
try:
msg = client_socket.recv(BUFSIZ).decode("utf8")
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
msg_list.insert(tkinter.END, '[' + current_time + '] ' + msg)
msg_list.yview(END)
msg_list.yview()
except OSError:
break
def send(event=None):
msg = my_msg.get()
if msg.isspace() != True:
my_msg.set("")
client_socket.send(bytes(msg, "utf8"))
msg_list.yview(END)
msg_list.yview()
elif msg.isspace() == True:
my_msg.set("")
if msg == "{quit}":
client_socket.close()
top.quit()
def on_closing(event=None):
top.destroy()
my_msg.set("{quit}")
send()
top.quit()
top = tkinter.Tk()
top.resizable(width=False, height=False)
#top.iconbitmap('C:/Users/Ethen Dixon/Downloads/filled_chat_aH2_icon.ico')
top.title("Chat Room 90")
#style = ThemedStyle(top)
#style.set_theme("equilux")
messages_frame = tkinter.Frame(top)
my_msg = tkinter.StringVar()
my_msg.set("[type here]")
scrollbar = tkinter.Scrollbar(messages_frame)
msg_list = tkinter.Listbox(messages_frame, height=30, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
msg_list.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
msg_list.pack()
messages_frame.pack()
entry_field = tkinter.Entry(top, textvariable=my_msg, width=100)
entry_field.bind("<Return>", send)
entry_field.pack()
send_button = tkinter.Button(top, text="Send", command=send)
send_button.pack()
top.protocol("WM_DELETE_WINDOW", on_closing)
HOST = input('Enter host: ')
PORT = input('Enter port: ')
if not PORT:
PORT = 33000
else:
PORT = int(PORT)
BUFSIZ = 1024
ADDR = (HOST, PORT)
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(ADDR)
receive_thread = Thread(target=receive)
receive_thread.start()
tkinter.mainloop()
一种方法是使用
widget.unbind(sequence,funcid=None)
方法。
顾名思义,这将删除w上已确定事件的绑定
然后,您可以使用tkinter内置方法root.after()
调用您创建的函数,将按钮重新绑定到该函数
但要使其正常工作,您需要使用.bind()
方法绑定send_按钮
def rebind():
send_button.bind("<Button-1>", send)
send_button.bind("<Button-1>", send)
send_button.unbind("<Button-1>", funcid=None)
top.after(time in miliseconds, rebind)
def rebind():
发送按钮。绑定(“,发送)
发送按钮。绑定(“,发送)
发送按钮。取消绑定(“,funcid=None)
顶部。之后(以毫秒为单位的时间,重新绑定)
是的,有很多方法可以做到这一点。您认为您可能会尝试什么?与时间有关。睡眠(x),但在尝试之后,它只是减慢了应用程序和发送的消息的速度。您可以直接删除消息吗?大概用户可以删除客户端上实现的任何限制,以克服该限制;更好的方法是在服务器端安装速率限制逻辑,例如,将传入消息添加到FIFO队列的尾部,并且仅以每秒1的最大速率从队列的头部弹出消息(转发到其他客户端),等等。(不要忘记将FIFO队列的大小限制在合理的最大值,以便恶意用户无法使用它填充服务器的RAM)创建按钮时不要忘记删除命令
def rebind():
send_button.bind("<Button-1>", send)
send_button.bind("<Button-1>", send)
send_button.unbind("<Button-1>", funcid=None)
top.after(time in miliseconds, rebind)