Module CoffeeChat.coffeechat.Client
Configuração do cliente
Expand source code
"""Configuração do cliente"""
import socket
import tkinter as tk
from datetime import datetime
from coffeechat.Client.send import *
from coffeechat.Client.receive import *
def get_name(entry, window, obj):
"""
Captura o nome do usuário pela interface gráfica.
Attributes:
entry (tk.Entry): Campo de entrada para o nome do usuário.
window (tk.Frame): Janela da interface gráfica onde é localizado o campo de entrada.
obj (Client): Objeto do tipo Client.
"""
obj.name = entry.get()
window.destroy()
class Client:
"""
Oferece suporte ao gerenciamento de conexões cliente-servidor e integração com a GUI.
Attributes:
host (str): Endereço IP do socket de escuta do servidor.
port (int): Número da porta do socket de escuta do servidor.
sock (socket.socket): Objeto socket conectado.
name (str): Nome de usuário do cliente.
messages (tk.Listbox): Objeto tk.Listbox que contém todas as mensagens exibidas na GUI.
"""
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.name = None
self.messages = None
def start(self):
"""
Estabelece a conexão cliente-servidor. Reúne a entrada do usuário para o nome de usuário,
cria e inicia as threads de envio e recebimento e notifica outros clientes conectados.
Returns:
Um objeto Receive que representa o segmento de recebimento.
"""
print(f'Tentando se conecatar com {self.host}:{self.port}...')
self.sock.connect((self.host, self.port))
print(f'Conectado com sucesso a {self.host}:{self.port}\n')
# INTERFACE
window = tk.Tk()
window.title('Cliente - Nome')
window.resizable(height=False, width=False)
if os.name == 'nt':
window.iconbitmap('img/logo_2.ico')
host_input = tk.Entry(master=window,
width='50',
borderwidth=18,
bg='#ccc',
relief=tk.FLAT,
font='Times 10')
host_input.pack(fill=tk.BOTH, expand=True)
host_input.bind("<Return>",
lambda x: get_name(host_input, window, self))
host_input.insert(0,
"Digite o nome desejado sem caracteres especiais.")
host_input.bind("<Button-1>", lambda x: host_input.delete(0, tk.END))
width = 350
heigth = 50
x = (window.winfo_screenwidth() // 2) - (width // 2)
y = (window.winfo_screenheight() // 2) - (heigth // 2)
window.geometry('{}x{}+{}+{}'.format(width, heigth, x, y))
window.mainloop()
# self.name = input('Your name: ')
print(
f'\nBem Vindo, {self.name}! Preparando para enviar mensagens...'
)
# create send and receive threads
send = Send(self.sock, self.name)
receive = Receive(self.sock, self.name)
# start send and receive threads
send.start()
receive.start()
self.sock.sendall('Server: {} acabou de se juntar ao chat, diga ola!'.format(
self.name).encode('ascii'))
print("\rTudo pronto! Voce pode sair do chat digitando QUIT.\n")
print(f'{self.name}: ', end='')
return receive
def send(self, text_input):
"""
Envia dados text_input da GUI. Este método deve ser vinculado a text_input e
quaisquer outros widgets que ativem uma função semelhante, por exemplo, botões.
Digitar 'QUIT' fechará a conexão e sairá do aplicativo.
Args:
text_input(tk.Entry): Objeto tk.Entry destinado à entrada de texto do usuário.
"""
# current date and time
now = datetime.now()
timestamp = now.strftime("%H:%M:%S")
message = text_input.get()
text_input.delete(0, tk.END)
self.messages.insert(
tk.END,
'{}: {}'.format('(' + str(timestamp) + ')' + ' ' + self.name,
message).encode('ascii'))
if message == 'QUIT':
self.sock.sendall('Server: {} saiu do chat.'.format(
self.name).encode('ascii'))
print('\n Saindo...')
self.sock.close()
os._exit(0)
else:
self.sock.sendall('{}: {}'.format(self.name,
message).encode('ascii'))
Sub-modules
CoffeeChat.coffeechat.Client.receive-
Configuração da classe resposável por receber mensagens do servidor
CoffeeChat.coffeechat.Client.screen-
Configuração da tela da sala de bate-papo
CoffeeChat.coffeechat.Client.send-
Configuração da classe resposável por enviar mensagens para o servidor
Functions
def get_name(entry, window, obj)-
Captura o nome do usuário pela interface gráfica.
Attributes
entry:tk.Entry- Campo de entrada para o nome do usuário.
window:tk.Frame- Janela da interface gráfica onde é localizado o campo de entrada.
obj:Client- Objeto do tipo Client.
Expand source code
def get_name(entry, window, obj): """ Captura o nome do usuário pela interface gráfica. Attributes: entry (tk.Entry): Campo de entrada para o nome do usuário. window (tk.Frame): Janela da interface gráfica onde é localizado o campo de entrada. obj (Client): Objeto do tipo Client. """ obj.name = entry.get() window.destroy()
Classes
class Client (host, port)-
Oferece suporte ao gerenciamento de conexões cliente-servidor e integração com a GUI.
Attributes
host:str- Endereço IP do socket de escuta do servidor.
port:int- Número da porta do socket de escuta do servidor.
sock:socket.socket- Objeto socket conectado.
name:str- Nome de usuário do cliente.
messages:tk.Listbox- Objeto tk.Listbox que contém todas as mensagens exibidas na GUI.
Expand source code
class Client: """ Oferece suporte ao gerenciamento de conexões cliente-servidor e integração com a GUI. Attributes: host (str): Endereço IP do socket de escuta do servidor. port (int): Número da porta do socket de escuta do servidor. sock (socket.socket): Objeto socket conectado. name (str): Nome de usuário do cliente. messages (tk.Listbox): Objeto tk.Listbox que contém todas as mensagens exibidas na GUI. """ def __init__(self, host, port): self.host = host self.port = port self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.name = None self.messages = None def start(self): """ Estabelece a conexão cliente-servidor. Reúne a entrada do usuário para o nome de usuário, cria e inicia as threads de envio e recebimento e notifica outros clientes conectados. Returns: Um objeto Receive que representa o segmento de recebimento. """ print(f'Tentando se conecatar com {self.host}:{self.port}...') self.sock.connect((self.host, self.port)) print(f'Conectado com sucesso a {self.host}:{self.port}\n') # INTERFACE window = tk.Tk() window.title('Cliente - Nome') window.resizable(height=False, width=False) if os.name == 'nt': window.iconbitmap('img/logo_2.ico') host_input = tk.Entry(master=window, width='50', borderwidth=18, bg='#ccc', relief=tk.FLAT, font='Times 10') host_input.pack(fill=tk.BOTH, expand=True) host_input.bind("<Return>", lambda x: get_name(host_input, window, self)) host_input.insert(0, "Digite o nome desejado sem caracteres especiais.") host_input.bind("<Button-1>", lambda x: host_input.delete(0, tk.END)) width = 350 heigth = 50 x = (window.winfo_screenwidth() // 2) - (width // 2) y = (window.winfo_screenheight() // 2) - (heigth // 2) window.geometry('{}x{}+{}+{}'.format(width, heigth, x, y)) window.mainloop() # self.name = input('Your name: ') print( f'\nBem Vindo, {self.name}! Preparando para enviar mensagens...' ) # create send and receive threads send = Send(self.sock, self.name) receive = Receive(self.sock, self.name) # start send and receive threads send.start() receive.start() self.sock.sendall('Server: {} acabou de se juntar ao chat, diga ola!'.format( self.name).encode('ascii')) print("\rTudo pronto! Voce pode sair do chat digitando QUIT.\n") print(f'{self.name}: ', end='') return receive def send(self, text_input): """ Envia dados text_input da GUI. Este método deve ser vinculado a text_input e quaisquer outros widgets que ativem uma função semelhante, por exemplo, botões. Digitar 'QUIT' fechará a conexão e sairá do aplicativo. Args: text_input(tk.Entry): Objeto tk.Entry destinado à entrada de texto do usuário. """ # current date and time now = datetime.now() timestamp = now.strftime("%H:%M:%S") message = text_input.get() text_input.delete(0, tk.END) self.messages.insert( tk.END, '{}: {}'.format('(' + str(timestamp) + ')' + ' ' + self.name, message).encode('ascii')) if message == 'QUIT': self.sock.sendall('Server: {} saiu do chat.'.format( self.name).encode('ascii')) print('\n Saindo...') self.sock.close() os._exit(0) else: self.sock.sendall('{}: {}'.format(self.name, message).encode('ascii'))Methods
def send(self, text_input)-
Envia dados text_input da GUI. Este método deve ser vinculado a text_input e quaisquer outros widgets que ativem uma função semelhante, por exemplo, botões. Digitar 'QUIT' fechará a conexão e sairá do aplicativo.
Args
text_input(tk.Entry): Objeto tk.Entry destinado à entrada de texto do usuário.
Expand source code
def send(self, text_input): """ Envia dados text_input da GUI. Este método deve ser vinculado a text_input e quaisquer outros widgets que ativem uma função semelhante, por exemplo, botões. Digitar 'QUIT' fechará a conexão e sairá do aplicativo. Args: text_input(tk.Entry): Objeto tk.Entry destinado à entrada de texto do usuário. """ # current date and time now = datetime.now() timestamp = now.strftime("%H:%M:%S") message = text_input.get() text_input.delete(0, tk.END) self.messages.insert( tk.END, '{}: {}'.format('(' + str(timestamp) + ')' + ' ' + self.name, message).encode('ascii')) if message == 'QUIT': self.sock.sendall('Server: {} saiu do chat.'.format( self.name).encode('ascii')) print('\n Saindo...') self.sock.close() os._exit(0) else: self.sock.sendall('{}: {}'.format(self.name, message).encode('ascii')) def start(self)-
Estabelece a conexão cliente-servidor. Reúne a entrada do usuário para o nome de usuário, cria e inicia as threads de envio e recebimento e notifica outros clientes conectados.
Returns
Um objeto Receive que representa o segmento de recebimento.
Expand source code
def start(self): """ Estabelece a conexão cliente-servidor. Reúne a entrada do usuário para o nome de usuário, cria e inicia as threads de envio e recebimento e notifica outros clientes conectados. Returns: Um objeto Receive que representa o segmento de recebimento. """ print(f'Tentando se conecatar com {self.host}:{self.port}...') self.sock.connect((self.host, self.port)) print(f'Conectado com sucesso a {self.host}:{self.port}\n') # INTERFACE window = tk.Tk() window.title('Cliente - Nome') window.resizable(height=False, width=False) if os.name == 'nt': window.iconbitmap('img/logo_2.ico') host_input = tk.Entry(master=window, width='50', borderwidth=18, bg='#ccc', relief=tk.FLAT, font='Times 10') host_input.pack(fill=tk.BOTH, expand=True) host_input.bind("<Return>", lambda x: get_name(host_input, window, self)) host_input.insert(0, "Digite o nome desejado sem caracteres especiais.") host_input.bind("<Button-1>", lambda x: host_input.delete(0, tk.END)) width = 350 heigth = 50 x = (window.winfo_screenwidth() // 2) - (width // 2) y = (window.winfo_screenheight() // 2) - (heigth // 2) window.geometry('{}x{}+{}+{}'.format(width, heigth, x, y)) window.mainloop() # self.name = input('Your name: ') print( f'\nBem Vindo, {self.name}! Preparando para enviar mensagens...' ) # create send and receive threads send = Send(self.sock, self.name) receive = Receive(self.sock, self.name) # start send and receive threads send.start() receive.start() self.sock.sendall('Server: {} acabou de se juntar ao chat, diga ola!'.format( self.name).encode('ascii')) print("\rTudo pronto! Voce pode sair do chat digitando QUIT.\n") print(f'{self.name}: ', end='') return receive