- Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathexample.py
More file actions
Latest commit
111 lines (83 loc) · 2.27 KB
/
Copy pathexample.py
File metadata and controls
111 lines (83 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
"""
Example: HyperDHT from Python.
Usage:
# Server
python example.py server
# Client (pass the server's public key)
python example.py connect <public_key_hex>
# Keypair
python example.py keygen
"""
importsys
sys.path.insert(0, ".")
fromhyperdhtimportHyperDHT, KeyPair
defcmd_keygen():
kp=KeyPair.generate()
print(f"Public key: {kp.public_key.hex()}")
print(f"Secret key: {kp.secret_key.hex()}")
defcmd_server():
dht=HyperDHT()
dht.bind()
kp=KeyPair.generate()
server=dht.create_server()
defon_connection(conn):
print(f"Client connected: {conn.remote_key[:16].hex()}...")
print(f" From: {conn.peer_host}:{conn.peer_port}")
server.listen(kp, on_connection)
print(f"Server listening")
print(f"Public key: {kp.public_key.hex()}")
print(f"Port: {dht.port}")
print(f"Ctrl+C to stop")
try:
dht.run()
exceptKeyboardInterrupt:
pass
finally:
dht.destroy()
defcmd_connect(pk_hex):
"""JS-style: one call returns a ready-to-use stream."""
remote_pk=bytes.fromhex(pk_hex)
dht=HyperDHT()
dht.bind()
connected=False
defon_open(stream):
nonlocalconnected
connected=True
print("Connected! Sending hello...")
stream.write(b"hello from python")
defon_data(data):
print(f"Received: {data!r}")
defon_close():
print("Stream closed")
dht.destroy()
defon_error(code):
print(f"Connection failed: {code}")
dht.destroy()
print(f"Connecting to {pk_hex[:32]}...")
stream=dht.connect_stream(
remote_pk,
on_open=on_open,
on_data=on_data,
on_close=on_close,
on_error=on_error,
)
# You can even queue a write before on_open fires:
# stream.write(b"queued before open")
dht.run()
ifconnected:
print("Success!")
if__name__=="__main__":
iflen(sys.argv) <2:
print(__doc__)
sys.exit(1)
cmd=sys.argv[1]
ifcmd=="keygen":
cmd_keygen()
elifcmd=="server":
cmd_server()
elifcmd=="connect"andlen(sys.argv) >=3:
cmd_connect(sys.argv[2])
else:
print(__doc__)
sys.exit(1)