<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/rss/stylesheet/" type="text/xsl"?>
<rss xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:taxo='http://purl.org/rss/1.0/modules/taxonomy/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:itunes='http://www.itunes.com/dtds/podcast-1.0.dtd' xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0" xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:podbridge='http://www.podbridge.com/podbridge-ad.dtd' version='2.0'>
<channel>
  <title>Test Channel</title>
  <language>en-us</language>
  <generator>microfeed.org</generator>
  <itunes:type>episodic</itunes:type>
  <itunes:explicit>false</itunes:explicit>
  <atom:link rel="self" href="https://mf.drktravis.dpdns.org/rss/" type="application/rss+xml"/>
  <link>https://mf-drktravis-dpdns-org.pages.dev</link>
  <description>
    <![CDATA[<p>a test channel</p>]]>
  </description>
  <itunes:author>lx</itunes:author>
  <itunes:image href="https://mf.drktravis.dpdns.org/assets/default/channel-image.png"/>
  <image>
    <title>Test Channel</title>
    <url>https://mf.drktravis.dpdns.org/assets/default/channel-image.png</url>
    <link>https://mf-drktravis-dpdns-org.pages.dev</link>
  </image>
  <copyright>©2025</copyright>
  <item>
    <title>socket</title>
    <guid>-Y-nUqC3Ni1</guid>
    <pubDate>Mon, 27 Oct 2025 01:15:49 GMT</pubDate>
    <itunes:explicit>false</itunes:explicit>
    <description>
      <![CDATA[<h3>socket 服务端</h3><pre class="ql-syntax" spellcheck="false"># threaded_server.py
import Lib.debug.log
import socket, threading
import json
import struct


class SocketServer:
&nbsp; &nbsp; HOST, PORT, BUFSIZE = '0.0.0.0', 5000, 1024 * 32
&nbsp; &nbsp; 
&nbsp; &nbsp; def __init__(self) -&gt; None:
&nbsp; &nbsp; &nbsp; &nbsp; self.handle = socket.socket()
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.bind((self.HOST, self.PORT))
&nbsp; &nbsp; &nbsp; &nbsp; self.handle.listen(5)
&nbsp; &nbsp; 
&nbsp; &nbsp; def start(self):
&nbsp; &nbsp; &nbsp; &nbsp; print(r'[*] Listening %s:%s' % (self.HOST, self.PORT))
&nbsp; &nbsp; &nbsp; &nbsp; while True:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('wait connection...')
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection, (ip, port) = self.handle.accept()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; threading.Thread(target=self.handle_client, args=(connection, ip, port), daemon=True).start()


&nbsp; &nbsp; def handle_client(self, connection: socket.socket, ip: str, port: int):
&nbsp; &nbsp; &nbsp; &nbsp; ip_port = '%s:%s' % (ip, port)
&nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; with connection:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[-] Connected: (%s, %s)' % (ip, port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while True:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[%s] wait message...' % (ip_port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n, = struct.unpack('!I', connection.recv(4))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # data = connection.recv(n)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(n)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a, b = n / self.BUFSIZE, n % self.BUFSIZE
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(a, b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a, b = int(a), int(b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = b''
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for i in range(a):
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('%s/%s' % (i+1, a))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += connection.recv(self.BUFSIZE)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += connection.recv(b)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # data = connection.recv(self.BUFSIZE)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[%s] get message!' % (ip_port))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(data)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('[%s] %s' % (ip_port, data))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # hex_str = ''.join([r'\x%02x' % v for v in data])
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print('[%s] %s' % (ip_port, hex_str))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # obj = json.loads(data.decode('utf-8'))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(obj)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # print(len(data))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # with open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\sd.iso', 'wb') as f:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # &nbsp; &nbsp; f.write(data)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if not data:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connection.sendall(data) &nbsp; # 回显
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('[-] Disconnected: (%s, %s)' % (ip, port))


if __name__ == '__main__':
&nbsp; &nbsp; SocketServer().start()

</pre><h3>socket 客户端</h3><p><br></p><pre class="ql-syntax" spellcheck="false">import socket
import struct
client = socket.socket()
client.connect(('localhost', 5000))



def send_all(soc: socket.socket, data: bytes):
&nbsp; &nbsp; """
&nbsp; &nbsp; 传输的数据格式定义为：数据头(4字节) + 数据本体
&nbsp; &nbsp; - 数据头：表示数据本体的长度(单位为字节)，如：b`\x00\x00\x00\x07f` 表示数据本体长度是 127字节 (总共就需要发送 131字节)
&nbsp; &nbsp; - 数据本体：需要发送的数据
&nbsp; &nbsp; 注：4字节能表示 2^32个无符号整数，即上述定义能表示约 4TB 的传输数据
&nbsp; &nbsp; """
&nbsp; &nbsp; len_bytes = struct.pack('!I', len(data))
&nbsp; &nbsp; # print(data)
&nbsp; &nbsp; print(len(data))
&nbsp; &nbsp; soc.sendall(len_bytes + data)



# send_all(client, open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\fileviewer.exe', 'rb').read())


send_all(client, b'hello world')
send_all(client, '你干嘛'.encode('utf-8'))



import time; time.sleep(1)
</pre>]]>
    </description>
    <link>https://mf.drktravis.dpdns.org/i/socket--Y-nUqC3Ni1/</link>
    <itunes:episodeType>full</itunes:episodeType>
  </item>
</channel>
</rss>