Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
- from threading import Thread
- from datetime import datetime
- from select import select
- from sys import exit
- import errno
- class ChatClient():
- def __init__(self):
- self.HEADER_LENGTH = 10
- self.server_addr = ('localhost', 1234)
- self.client_socket = socket(AF_INET, SOCK_STREAM)
- self.client_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
- self.client_socket.connect((self.server_addr[0], self.server_addr[1]))
- self.client_socket.setblocking(False)
- self.my_username = input("Username: ")
- def run(self):
- username = self.my_username.encode('utf-8')
- username_header = f"{len(username):<{self.HEADER_LENGTH}}".encode('utf-8')
- self.client_socket.send(username_header+ username)
- while True:
- Thread(target=self.send_message).start()
- try:
- while True:
- self.username_header = self.client_socket.recv(self.HEADER_LENGTH)
- Thread(target=self.receive_message).start()
- if not len(self.username_header):
- print('Connection closed by the server')
- exit()
- except IOError as e:
- if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK:
- print(f"Reading error: {str(e)}")
- exit()
- except Exception as e:
- print(f"Reading error: {str(e)}")
- exit()
- continue
- def send_message(self):
- message = input(f'{self.my_username}> ')
- if message:
- message = message.encode('utf-8')
- self.message_header = f"{len(message):<{self.HEADER_LENGTH}}".encode('utf-8')
- self.client_socket.send(self.message_header + message)
- def receive_message(self):
- username_lenght = int(self.username_header.decode('utf-8').strip())
- username = self.client_socket.recv(username_lenght).decode('utf-8')
- message_header = self.client_socket.recv(self.HEADER_LENGTH)
- message_lenght = int(message_header.decode('utf-8').strip())
- message = self.client_socket.recv(message_lenght).decode('utf-8')
- print(f"{username}> {message}")
- c = ChatClient().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement