Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1from fiber import Fiber 

2from .. import NetError 

3from ..secure import Connection as SecureConnection 

4from ..secure import Context as SecureContext 

5from ..secure import IOHandler 

6from ..tcp.client import Client as TcpClient 

7from ..tcp.server import Server as TcpServer 

8from io import Reader 

9 

10class _IOHandler(IOHandler): 

11 _tcp_client: TcpClient 

12 

13 func __init__(self, tcp_client: TcpClient): 

14 self._tcp_client = tcp_client 

15 

16 func write(self, data: bytes): 

17 self._tcp_client.write(data) 

18 

19 func read(self, size: i64) -> bytes: 

20 return self._tcp_client.read(size) 

21 

22class Client(Reader): 

23 """A secure TCP client using SSL/TLS. 

24 

25 """ 

26 

27 _tcp_client: TcpClient 

28 _secure_connection: SecureConnection 

29 

30 func __init__(self, context: SecureContext = SecureContext()): 

31 self._tcp_client = TcpClient() 

32 self._secure_connection = SecureConnection(context, 

33 _IOHandler(self._tcp_client)) 

34 

35 func __del__(self): 

36 pass 

37 

38 func is_connected(self) -> bool: 

39 """Returns true if conencted to the server, false otherwise. 

40 

41 """ 

42 

43 return self._secure_connection.is_connected() 

44 

45 func connect(self, host: string, port: i64): 

46 """Connect to a server using given `host` and `port`. 

47 

48 """ 

49 

50 self._tcp_client.connect(host, port) 

51 self._secure_connection.connect() 

52 

53 func disconnect(self): 

54 """Disconnect from the server. 

55 

56 """ 

57 

58 self._secure_connection.disconnect() 

59 self._tcp_client.disconnect() 

60 

61 func write(self, data: bytes): 

62 """Write data to the server. 

63 

64 """ 

65 

66 self._secure_connection.write(data) 

67 

68 func read(self, size: i64) -> bytes: 

69 """Read data from the server. Always returns size number of bytes, 

70 unless the connection was closed, in which case the remaining 

71 data is returned. 

72 """ 

73 

74 return self._secure_connection.read(size) 

75 

76# class _ServerCommunicationFiber(Fiber): 

77# server: TcpServer 

78# 

79# func run(self): 

80# client = self.server.accept() 

81# assert client.is_connected() 

82# assert client.read(1) == b"1" 

83# assert client.read(9) == b"234567890" 

84# client.write(b"0") 

85# client.write(b"987654321") 

86# assert client.read(1) is None 

87# assert not client.is_connected() 

88# 

89# test server_communication(): 

90# port = 50232 

91# 

92# server = TcpServer() 

93# server.listen(port) 

94# server_fiber = _ServerCommunicationFiber(server) 

95# server_fiber.start() 

96# 

97# client = Client() 

98# assert not client.is_connected() 

99# client.connect("localhost", port) 

100# # assert client.is_connected() 

101# # client.write(b"123456789") 

102# # client.write(b"0") 

103# # assert client.read(9) == b"098765432" 

104# # assert client.read(1) == b"1" 

105# # 

106# # client.disconnect() 

107# # assert not client.is_connected() 

108# # server_fiber.join()