Advertisement
Falexom

Untitled

Nov 6th, 2021
1,165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | None | 0 0
  1. import socket
  2. import asyncio
  3. from Socket import Socket
  4. from datetime import datetime
  5. from os import system
  6.  
  7. # the chat for a very lonely person
  8. # without encryption and GUI
  9. # completed and debugged
  10.  
  11. class Socket:
  12.     def __init__(self):
  13.         self.socket = socket.socket(
  14.             socket.AF_INET,
  15.             socket.SOCK_STREAM,
  16.         )  # TCP/IP
  17.         self.main_loop = asyncio.new_event_loop()   # single loop
  18.  
  19.     async def send_data(self, data=None):
  20.         raise NotImplementedError()
  21.  
  22.     async def listen_socket(self, listened_socket=None):
  23.         raise NotImplementedError()
  24.  
  25.     async def main(self):
  26.         raise NotImplementedError()   # if no-async
  27.  
  28.     def start(self):
  29.         self.main_loop.run_until_complete(self.main())
  30.  
  31.     def set_up(self):
  32.         raise NotImplementedError()
  33.  
  34. class Server(Socket):
  35.     def __init__(self):
  36.         super(Server, self).__init__()
  37.  
  38.         self.users = []
  39.  
  40.     def set_up(self):
  41.         self.socket.bind(("127.0.0.1", 5000))
  42.         self.socket.listen(5)
  43.         self.socket.setblocking(False)  # non-blocking
  44.         print('Server is listening')
  45.  
  46.     async def send_data(self, data=None):
  47.         for user in self.users:
  48.             await self.main_loop.sock_sendall(user, data)
  49.  
  50.     async def listen_socket(self, listened_socket=None):
  51.         if not listened_socket:
  52.             return
  53.         while True:
  54.             try:
  55.                 data = await self.main_loop.sock_recv(listened_socket, 2048)  # bytes
  56.                 await self.send_data(data)
  57.  
  58.             except ConnectionResetError:
  59.                 print("Client removed!")
  60.                 self.users.remove(listened_socket)
  61.                 return
  62.  
  63.     async def accept_sockets(self):
  64.         while True:
  65.             u_socket, address = await self.main_loop.sock_accept(self.socket)  # connected
  66.             print(f"User <{address[0]}> connected!")
  67.  
  68.             self.users.append(u_socket)
  69.             self.main_loop.create_task(self.listen_socket(u_socket))
  70.  
  71.     async def main(self):
  72.         await self.main_loop.create_task(self.accept_sockets())
  73.  
  74. '''
  75. if __name__ == '__main__':
  76.    server = Server()
  77.    server.set_up()
  78.    server.start()  # main loop
  79. '''
  80.  
  81. class Client(Socket):
  82.  
  83.     def __init__(self):
  84.         super(Client, self).__init__()
  85.         self.messages = ''
  86.  
  87.     def set_up(self):
  88.         try:
  89.             self.socket.connect(
  90.                 ("127.0.0.1", 5000)
  91.             )
  92.  
  93.         except ConnectionRefusedError:
  94.             print("Sorry, server is offline!")
  95.             exit(0)
  96.  
  97.         self.socket.setblocking(False)    # non-block
  98.  
  99.     async def listen_socket(self, listened_socket=None):    # listening
  100.         while True:
  101.             data = await self.main_loop.sock_recv(self.socket, 2048)    # get
  102.             self.messages += f"{datetime.now().date()}: {data.decode('utf-8')}\n"
  103.  
  104.             system("cls")
  105.             print(self.messages)
  106.  
  107.     async def send_data(self, data=None):
  108.         while True:
  109.             data = await self.main_loop.run_in_executor(None, input)  # get
  110.             await self.main_loop.sock_sendall(self.socket, data.encode('utf-8'))
  111.  
  112.     async def main(self):
  113.         await asyncio.gather(
  114.             # all in await
  115.             self.main_loop.create_task(self.listen_socket()),
  116.             self.main_loop.create_task(self.send_data())
  117.  
  118.         )
  119.  
  120. '''
  121. if __name__ == '__main__':
  122.    client = Client()
  123.    client.set_up()
  124.    client.start()
  125. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement