Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法限制Python聊天室应用程序中客户端每秒发送的消息数?_Python_Sockets_Tkinter_Spam Prevention_Chatroom - Fatal编程技术网

有没有办法限制Python聊天室应用程序中客户端每秒发送的消息数?

有没有办法限制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 #

我正在为学校制作一个python聊天室应用程序,其中包含一个运行良好的客户端和服务器端脚本。我现在为聊天室添加了多种功能,使其更易于使用,其中之一就是垃圾邮件保护。是否有一种方法可以记录客户端在某一特定时间内发送的消息数量,如果超过最大值,则会在某一时间内静音

clientside.py:

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)