Use protocol.py to test connection between client and server after run server_demo.py destination port in protocol.py is need to change after run server_demo.py
### Construct a packet
```python
from initial_packet import InitialPacket
from aioquic.quic.packet import *
pkg = InitialPacket(fill your args here)
pkg.new_packet()
pkg.push_frame(QuicFrameType.CRYPTO, [("bytes", b"hello")])
pkg.push_frame(QuicFrameType.ACK, [("uint16", 1)])
pkg.new_packet()
pkg.push_frame(QuicFrameType.CRYPTO, [("bytes", b"world")])
datastreams, packets = pkg.build()
for datastream in datastreams:
print(datastream)
# b'\xcf\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x96\xc3}2I\x83\xdc\xef[\xcc\xff\xe2d\xef\xce\x08\xbe\x0c\'\x1e\x00\x13P6\xc9P\x1a\x94^\xc4~k,\xa8\x01\x19\x92\xab\xbbpa\xea\xee\x86\x1aP\xf1\x7ft\x18\x9c\xd6{\x9c\xe5w\xc0\x91\xa2~\x00\xea8\x90[F\xb1\x81c\x95\xd2\xf7W,N\n\xa2\xd7\x07\n\x93+$\x18\x98\xc1\xc3\xa4\x02\xcb\x0e\x8f\xf5[\x19\xf0\xe2\xe0\x01\xc6\xe82KX\x9cK.\xa6r\xe0r\xe248\x83z\x00\xb9\xddW\xfb}\xa8\xcb\xb7\xf0/\xb6\xb3\xdb\x14\x8d\xc7\xa3\x86\xa5\xebG%\xf2\xc1\x03L\x93\xf3\xa2\xc4\x85BG\x0c\xdb\xd99R\xe2\x1b\xea\x0c\xc5\'\xe5;\xb0\x960\xf9H\x94]d\r\x03O\x94Y\x8b\x02\\\xc0\xbfG\xadK~\x7f\xb7\xb3\x8d]El\xc06,\x92c!e\xad\xa0\xa1/\xd2\xf1c\xf8\xae<\xa9;Y\x070\x8cLuQ\xcf\xc5\x9c\x87?\xa8`\x16u\xe2DLR\xfa&\xa1\xa9\x9f\xb7\x94;\xc9\xc6>B\xdf\x92\x12\xfar\xec\x91\xb4\x0e}\x82\xc8\x0c\xd4\x1b\xact\xd5\x1a6N\xcen\xa9\xd7t\xbd\x98\xe6\xd4\\U\xfaKkO8\xbe\x95\x02\xd5\xaf\x80\x9f(V\xe9A\xa6=I\xa6\x9f\xd8\xb7\xcc\xe1\xe0K5\x9eSH.\xd4\xb4\xa0\xe3Z$\'\x1cWM\x08\x8bV\xda\xdf\xcft\xb0\x04\xb2\xc8QX\x89\xd4\x99\x0c\x8cS\x97hV{<\xc5`\x01\xdb\x86\x0c\xec\xab\xeb\xe5\x0b\xa4#w\xd4\x8d\xdb\x04\xbf\x11\xad\x13\xa0\xf8g\xfd\x10RL\t\xd3\x0e"\x98\x00\xe6A\xb1\xc43\xb0\xe1\xdd\x1e\x94>\xfc&\x9c\xec\x8a(?\xe6J\xe7\xd0\x1c\x90\x9eh\x98{\xcd\xc8\xaa\xd9y\x9fu\x9a\xbd[\xd3\x91v\xd6}:\x02H\xf4\xe2vj\xf3z\xa1\xf24U3\xab\x90\x91\x02y\xb5\xcf\xd8\xa5n\xb1No\xcdR\xd4\xf8@\xa4>,\xb9\xf8m\x03\x8a4l:\x00\xa3\xe0\xbb\xc6\x08\xc3_\x0b\x82$\xfb\x89c\x9f\x14|Mh\x8fap"\xbe}VEw\x83(\x86m\x19d\xd1\x85\xc2iz\xceg\x8fE\xd8\xc6zs\xd6\xf4K\x1a\xa5\x84\xbe\xc1\xc2D8\x1f\xc5Jz\x9a\x97\x93\x00\x8e\xb1#\xa6{?UF\x1a\x06\xadP\xa7\xb4j.c\xdd\xaa9\xee\x84\x0e`Tg\xa7\xb1\xe3p\xde\xcb\x00\xcfD%\x1e^Vg#\xbf\x8c\xe1\xee\xb0e\xd6\xdd\xc2\x81\xdd\x8a\x04Q8r\xa6:\xd6\xf7$\\\x9e\xf5\xe9=sf\xad\xa0<f\x10\x88\xca7gV\x80v\x10\xc6\x91g\xf2=o+\xc4iE\x0f3"\xc6(\x0f\xa0s\x0b\x10\x03\xb5Vb:\xa0K\xc6P\x07\xe6\xf5[\xe0\x99\x90b\x89.\xd3wq`\xe6\xfco[\xa5<\xeb\xcf\xe5\xc4r*\x9e\x13\x06\\kF<q\xad\x8a\xff\x96\xefT\x90\x97\x10\x86L\x99\x80I\xb8Gk\xc64}\xd7n\xa6-\xd1\x06\xbf\xa7\x87;6\x1fD\xd14\x01\x89@\xe8\x80S\x97\xe2\xd1\xf8)\xd1jks?baL`\xdb\xdbL\x8fYP\xd9\x99\xf9\xfc\xc8\xdfYL\x97xX\xc2\xeeM\xd8\xb9\x12\x10Ic`<\x16\x06\xa7\xdd\x83j\xfd\xa04fy\xf0\x85\xcc\xfe\x1bGk\xc2D\xa0\\\xaf\x971\r\xfdo\xa1\x9a\x97\x14\x80\x10\xc4\xfd.\xd6\x02\xa8\x1b\xff\xe2e\xd4\x16\xf8\xd1}\x9f\xb9U(\x17\xf6\xae7\xae\xc2\x81c4\xbc\x91\xff\xa3c\xf6w\xf5\n\x97H\xd0\xe5YB\xc3y\xf2\xd3\xe9\x0f\xa1t\xf1V\x86(J\xcc\xafY\xe8\xa89\xcc\x93\xfad\x9c`\x87\x90F#\'z\x9b\xb0\xdbYf\xecl\xaa^y\x00\xce<\xaao\x13G\xf2\xf9/~]\r\x14\xa8\x98\x163;\xe8\x8f\xea0\rT~,\xc6\x84Q\x11\n\t\x954\xd3\xfb\xe1bt\xf6\x01M\xa2\x105\x86\x7fx\xce\xd86ILm\xca\xc1}\xfcj\xc9r\xee\x14\xf9\xe1S\xae3_\xcc/\x82\x8d\x1f\xda\x19,\x18\x0b\xd2H\x82\xa0C\x18K2\xf43M\x11g\xaa9\xda\xa1\x9b\xf7\x12HH\xa8\xe2\x04\x91)\xb9\x95\x8b\x92\x98\x98x\xe2)n\xf0\\\x9dC\x96\xe1\xc9\x8b\x0eeq\xab\x1eK\xd4\x8f+\xbfO\tr\xdd\x16\x84\xb2\xe5} \\FHZB\x97\x7f\x97~\xb0p\xf0\xc7\xe3?j\x18\r&\xba+\x8e\xbe\xd0\x99\xbf\xc4+\xa9g!y1A$\xa3\xd7\x96\xf8]\x97\xbf\x05\xe6v\xd64l1|\x893\x1d(+\xaeT$\xae\xda\xc6\xb0TRV\x88X@\x95.\xeb\x8d\xf4\x18\x86/\xbc\xa6\xfb\xc2\xc4\x91\x8b\xbc\xdady1\xa1\x99\x05\x9e\xa1\xe1\x8f*\xda{_x\xa5l\xccR\xa9\xea\xfc\xad\x0bn\xd7\x99\xc5\xd2\x8c\x1b~\xaf\xf3\x87\x96\xc9\x96\x07\xac}\xa0\xff\x95P\x12\xd5\x1c&\xce%\x9b\xb2\xd5j\xd22\x16mX\xcd\xacD\x99{\x19O\x0781X'
# b'\xc4\x00\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x96\x82\x1b5\xeaW\x99\xe0.\xca\x81\xc0\x02`\xef\xbfjM-\x04\xa44G\x9d\xc1\xb90eB\xda\xaf\x9d\xf6\xd8|%\xbf\x1d\x92\x81\x9a\x9e\xf4\xa4\xaa8\xf9p^(\xc2\xae\xe8\xc9\x98\xdf\xc5d\xf9\xe0\xf3\xf1.\x97\r\xd4`\xe4\xe6\x89\xfe\xac\xd0\xc0_r}\xf0\x93<\xaa\x8b\xe6\xcd\x83Z\xb9?-\x02!\x19\x1e\xf5\x99\xb2r\xe2q\xf7\xaf\xa4\xd9\xaa\xa4\x96\x8cx\xa30\xb6gB\x83\xed\x14\xebV\xd6\x1eS\x8cNf\xbb6\x12v\xa3\xcd\x85\x1dR\xd9\x83\xdae]\x0bQD\xd3\x07N\x8f\x04!\xc9|\xc8\x11\xdf#\xbb\xfa\xbf\x87\xa5\xf6\xf2\x12\x8e\x14\x90\xb0\x08Y\x05j\x1c\xd7\x8a\x88}\xba\xbe[@uU\xc8\xdc\x0bG\xca\xe1\x8dQ\xbe\x16\x00\x95\xaf7\xd2n\x04\xa0%\xe1\xaa\xdeXm\x98F\x18o\xcbq\x13\x02%\xcb\xb8\x90fC\xa8\x99\x08\xb3\xd65D+\x88\x0f\x8f\xad\x11\r$,\xc5\x92\xd4\xaf\x95\x1d\xbb7$\xaa\xd97\xcd\x01T\xb1NIM\xfa\xc6?\xeb\x8cv\x12\x9d\x150\xc0_\xbb\x902\x82\x8b\xab\x9a\x10\x8a \xe6\xaa\x15\x04\x13\x1d^\x1f\x12\x9f!\x8b!\xd3L\x9a|\xc9\xcb\x1es\x17Y\xb71c\xd2\xfdl\xaf\xf5a\xc1>\xe5\xb7$R\x99\xeb\x1e\xf8i\xb8\xdc\xe4\xad\xdc\xb2D\xbf\x96\xda\xb2\x8a\xd5>\x03B?#\x14\xf2QA\x99\xcfqf]o\xb4\x9eb18V.N\x1c\x18\xfa\xdd\xaa#g\x80\xa54\xa9\xfb\x92\x8d%d\x12\xb8R/d\x12\xfe\x14\xee\xccT\x0fT\x0ft$EC$j\x95\xe3\xc6$\xcbH\xf4\x9b3\x9e\xd2\xa2\x90\x95i\xdb\x87Vx\xe6v\xc0\x9cX\xe8\x15aw\xf3\xb5\xe9\x1e\x00{\xe0"\xc9\xbd\xda1y\xb1\xf1\x91\xe5\xcb\xe1\xf3\x88`M\xc8\xdf\x89$\xae\xbd\x8f&$\x07\xd6|:_\xbf\xb5\xc0\xbd\xfc\xf0`\x13*\x0b \xf7--^,\xf8\xde\xa5\xfd\x89\xb618\xb3D\x81sB\x11\xef\xde\xe1\r\x7f\x0c\xfc$\x1cy\xfe3\xb3\xd1{#\xdfT\x7f\xa1\xfe\xd1\xe6\x1d\x8e\xdd\xc2\xd6z\xaa\xaa\x04r\xdd\x0b\xd9\xde\xaa\x99A"\xa0#\xed\xa1\x95\x9f\xe8\xa7\xc6\xf9\x9e2%\xcc\rN\x9a(\x88\x13\xf0\xde\xfc\xf1M\xd8\x80\xde\x7f\xd5\xd8\xc2\xca\xd9\xa3\xb5\x02Tq\xc3n\x9f\x06+G\xbd\xcf\x8a\xfb\xfa\xc4\xf8W\xf9\xfb\x90\xe9\x0f$\x0b\x9c\r\xcc\xbd\xe7\xde\xcfn=\x03\xc6^\xcbr\xb3\xeb\x1a\xda\x7f\x0e\xd0\xdbL\xfei\x83\xd4-0\xc6\xd5\xba\xa2\x99\xd4\xcc\xf6\xb0\xa6]R\xd0\xf0~\xe4Z\x9aW\x88,\xd6x\x9d\x96\xf2\xb6\xd52kv\xf8S\x17+\x14_"\x8a\x9f\x14\x10\xb9\xc5.\xcbX\xe2\xa3O\xa2\xe1\xb4\xa7]s}\xb0\xcb\xe0I\x99\xe7{OKb\xa8iP\xec\x91\nr\xfey\x13\xc4\xed69\xb5s\xca\xe9\xc5\xc4\xe0$\xf7\xceA\xb7W\xc9\xa2z!S}=\xc0]\xd7\xdd\xce\x1ca\xc8\x17\xff\x1c,A\xe9\'\xdd9\xa2\x8dj\x80\x0e\xea]K\xb94\xf4\xaf\xfe\x98\xbc\xf9\x9a\xbe\x8d*\x15\xe1\x00\xc5\xf6\xed[\xf0\x13T\xe5~\xda\x99\xabM\x1d<h\xbd\xb2/\x9c*~_\x00U\x8dy\xca{\xedg\xb3Hd\x87(YF\xf9\x03\xc5\x03\xdc\xd5\x14\xd3\x93[\xf4Z\xd7\x99\x1b\xe8w|\xe1\xffrDrHBm\x11\x03s[6\xa4.k\x01\xd6\x8d\xb5\x8e\x1b\xf2&\x9c\xabx\x98\x97l\x87\'/\\\x9bq\xe94\x11v\xfb\t\xcaj=\x177q5\xa0h\x91ov\xbf\x85#\xc6\x83\x9d\x87\xd0\xad\xc2\x02\xfdB\x07\x1b\x1a\x82\xc87\xfc\xb6\x86\xa2g\xb4e}\xc9=\xc0\xfa\xd6cm\xdb7\xf5\xee\x02\xb2\xb2\xacL\xb4Q\x89\xac\x85\xe3\xab\xd9\xc1\xfa\xd3\x9ad\x00\x95\xdb\x83E\xfa\xe09c\x16]\x8f\x07L6\x07n&\xbe.0_\xd4\xf98`\x19\xdc\xb4\xb8\xf7\xdbR\x92\xe4\x17\xbe\xd7\xdc\xd8\x91+\x06:\x18\n\x1e> ev\x8e\x98,2\xe8j0`\x0e\xd7p%\xeb\x1bw/\n\xaa\xed5\x82\x86\x1e\xdd\x00;dK\x0b\x891"\xd3q\xb8\x96\xbb\x96?\xcc;\xd5\xaf\x95\x8e\x88.\xfehP\x16\xcc<G\x1dI])D\x86\xfa(\xe5\x1c\xbe\xf54\n\xf7\x90[\x15/\xfcA\x88\x1c\xf2\xa5QQe|\x93:\xbd\x94\xce{g\xe7\x93\xff\xb5\x8f\xd5\xaa\x11{\x98\xa82\x8a\xc3)h\'E\x8aN\xfd\x88\xc5\xdej\xbbWh:\xe6\x14M2\xa4\xdf\xe8\x9eq\xdc\x847\xf9\x9e\x0c\x1b(t<\xb3\xaeE\xc8P\x82\x91\x0e\xa5\xbd\xda*\x9ed\xb2\x89`\xc6r\x00!\xd9\x18\x9a4R\xd5fF\x0f/Pd\xe5\xe0\x9fP\xfd\x94B\xb1?\r\x9enWw\x12\x13\x08x\xf9G\x15\xb9\x1c\xa9!\xca\x83\xb8!t\x00'
for packet in packets:
print(packet)
# QuicSentPacket(epoch=<Epoch.INITIAL: 0>, in_flight=True, is_ack_eliciting=True, is_crypto_packet=True, packet_number=0, packet_type=192, sent_time=None, sent_bytes=1200, delivery_handlers=[], quic_logger_frames=[])
# QuicSentPacket(epoch=<Epoch.INITIAL: 0>, in_flight=True, is_ack_eliciting=True, is_crypto_packet=True, packet_number=1, packet_type=192, sent_time=None, sent_bytes=1200, delivery_handlers=[], quic_logger_frames=[])