예제 #1
0
    def enviar_mensagem_para_o_servidor(self):
        while True:
            mensagem_para_enviar = ""
            try:
                mensagem_para_enviar = input(f"{self.nome} > ")
            except KeyboardInterrupt:
                self.encerrar_conexao_servidor()

            if mensagem_para_enviar:
                if mensagem_para_enviar in ["sair do jogo", "desconectar"]:
                    mensagem_desistencia = Mensagem(
                        tipo="desistencia",
                        conteudo="Você ganhou a partida",
                        remetente=self.nome,
                    )
                    mensagem_em_bytes = (mensagem_desistencia.
                                         converter_msg_em_bytes_para_enviar())
                    self.conexao.send(mensagem_em_bytes)
                    self.encerrar_conexao_servidor()
                    break
                else:
                    mensagem = Mensagem(tipo="chat",
                                        conteudo=mensagem_para_enviar,
                                        remetente=self.nome)
                    mensagem_em_bytes = mensagem.converter_msg_em_bytes_para_enviar(
                    )
                    self.conexao.send(mensagem_em_bytes)
예제 #2
0
    def iniciar_conexao_com_servidor(self):
        self.conexao = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.conexao.connect((self.endereco_ip, self.porta))
        self.conexao.setblocking(False)

        mensagem_inicial = Mensagem(tipo="chat",
                                    conteudo=self.nome,
                                    remetente=self.nome)
        mensagem_em_bytes = mensagem_inicial.converter_msg_em_bytes_para_enviar(
        )
        self.conexao.send(mensagem_em_bytes)
예제 #3
0
    def escutar_conexoes(self):
        while True:
            try:
                sockets_leitura, _, sockets_excecoes = select(
                    self.lista_conexoes, [], self.lista_conexoes
                )
            except KeyboardInterrupt:
                sys.exit("\nChat encerrado!")

            for conexao in sockets_leitura:
                if conexao == self.socket_servidor:
                    novo_cliente, infos_conexao = self.socket_servidor.accept()

                    mensagem = self.receber_mensagem_cliente(novo_cliente)
                    if mensagem is None:
                        continue

                    quantidade_conexoes = len(self.lista_conexoes)
                    self.lista_conexoes.append(novo_cliente)
                    self.clientes_conectados[novo_cliente] = novo_cliente

                    print(
                        "Nova conexão aceita {}:{}, username: {}".format(
                            *infos_conexao, mensagem.get("remetente")
                        )
                    )
                    conteudo_msg = ""
                    if (
                        not self.primeiro_jogador_se_conectou
                        and quantidade_conexoes == 1
                    ):
                        conteudo_msg = "Sim"
                        self.primeiro_jogador_se_conectou = True
                        print("o primeiro jogador conectou!")

                    mensagem_nova_conexao = Mensagem(
                        tipo="conexao_estabelecida",
                        conteudo=conteudo_msg,
                        remetente="servidor",
                    )
                    mensagem_nova_conexao = (
                        mensagem_nova_conexao.converter_msg_em_bytes_para_enviar()
                    )
                    novo_cliente.send(mensagem_nova_conexao)
                    print("mensagem enviada para a nova conexão")
                else:
                    mensagem_recebida = self.receber_mensagem_cliente(conexao)
                    if mensagem_recebida is None:
                        print("Fechando conexão de {}".format(conexao))
                        self.remover_conexao(conexao)
                        continue

                    print(
                        "Recebendo mensagem de {}: {}".format(
                            mensagem_recebida.get("remetente"),
                            mensagem_recebida.get("conteudo"),
                        )
                    )

                    for cliente in self.clientes_conectados:
                        if cliente != conexao:
                            cliente.send(
                                json.dumps(mensagem_recebida).encode(CODIFICACAO)
                            )

            for conexao in sockets_excecoes:
                self.remover_conexao(conexao)