<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Socket on 学无止境</title>
		<link>https://sunnnnner.github.io/tags/socket/</link>
		<description>Recent content in Socket on 学无止境</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Tue, 12 Jul 2022 14:37:29 +0800</lastBuildDate>
		
			<atom:link href="https://sunnnnner.github.io/tags/socket/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>网络概念与UDP编程</title>
				<link>https://sunnnnner.github.io/posts/%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E6%A6%82%E5%BF%B5%E5%92%8Cudp%E7%BC%96%E7%A8%8B/</link>
				<pubDate>Tue, 12 Jul 2022 14:37:29 +0800</pubDate>
				<guid>https://sunnnnner.github.io/posts/%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E6%A6%82%E5%BF%B5%E5%92%8Cudp%E7%BC%96%E7%A8%8B/</guid>
				<description>&lt;h2 id=&#34;1-网络基础概念&#34;&gt;1. 网络基础概念&lt;/h2&gt;&#xA;&lt;h3 id=&#34;11-网络定义&#34;&gt;1.1 网络定义&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;电路网络：由电子元件组成的信号传输系统&lt;/li&gt;&#xA;&lt;li&gt;三大网络：&#xA;&lt;ol&gt;&#xA;&lt;li&gt;电信网络&lt;/li&gt;&#xA;&lt;li&gt;有线电视网络&lt;/li&gt;&#xA;&lt;li&gt;计算机网络（互联网）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;12-网络层次&#34;&gt;1.2 网络层次&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;网络体系结构：&#xA;- 应用层&#xA;- 传输层&#xA;- 网际层（网络层）&#xA;- 网络接口层（链路层）&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;2-本地服务器配置&#34;&gt;2. 本地服务器配置&lt;/h2&gt;&#xA;&lt;h3 id=&#34;21-快速启动http服务&#34;&gt;2.1 快速启动HTTP服务&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# Python 2&#xA;python -m SimpleHTTPServer 8080&#xA;&#xA;# Python 3&#xA;python -m http.server 8080&#xA;&#xA;# 访问地址&#xA;http://127.0.0.1:8080  # 本机回环地址&#xA;http://localhost:8080   # 本机域名&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-socket编程基础&#34;&gt;3. Socket编程基础&lt;/h2&gt;&#xA;&lt;h3 id=&#34;31-socket类型&#34;&gt;3.1 Socket类型&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;import socket&#xA;&#xA;# 创建Socket对象&#xA;# 本地进程通信&#xA;unix_socket = socket.socket(socket.AF_UNIX)&#xA;&#xA;# 网络通信&#xA;inet_socket = socket.socket(socket.AF_INET)&#xA;&#xA;# 协议类型&#xA;tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP协议&#xA;udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   # UDP协议&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;32-socket地址族&#34;&gt;3.2 Socket地址族&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;地址族&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;说明&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;用途&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;AF_UNIX&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;本地通信&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;同一台计算机进程间通信&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;AF_INET&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;IPv4网络&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;互联网通信&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;AF_INET6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;IPv6网络&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;下一代互联网通信&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;4-udp通信&#34;&gt;4. UDP通信&lt;/h2&gt;&#xA;&lt;h3 id=&#34;41-udp特点&#34;&gt;4.1 UDP特点&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;无连接通信协议&lt;/li&gt;&#xA;&lt;li&gt;支持广播发送&lt;/li&gt;&#xA;&lt;li&gt;数据包大小限制（64KB）&lt;/li&gt;&#xA;&lt;li&gt;不保证可靠传输&lt;/li&gt;&#xA;&lt;li&gt;不保证数据顺序&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;42-基本udp通信示例&#34;&gt;4.2 基本UDP通信示例&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;import socket&#xA;&#xA;# 创建UDP Socket&#xA;udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)&#xA;&#xA;# 绑定本地地址和端口&#xA;local_addr = (&amp;#39;&amp;#39;, 8888)  # 空字符串表示本机所有IP&#xA;udp_socket.bind(local_addr)&#xA;&#xA;# 发送数据&#xA;target_addr = (&amp;#39;192.168.1.100&amp;#39;, 8888)&#xA;message = &amp;#34;Hello, UDP!&amp;#34;&#xA;udp_socket.sendto(message.encode(&amp;#39;utf-8&amp;#39;), target_addr)&#xA;&#xA;# 接收数据&#xA;while True:&#xA;    data, addr = udp_socket.recvfrom(1024)  # 缓冲区大小1024字节&#xA;    print(f&amp;#34;从{addr}接收到: {data.decode(&amp;#39;utf-8&amp;#39;)}&amp;#34;)&#xA;&#xA;# 关闭Socket&#xA;udp_socket.close()&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;43-端口绑定&#34;&gt;4.3 端口绑定&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 服务端绑定固定端口&#xA;server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)&#xA;server_socket.bind((&amp;#39;&amp;#39;, 80))  # 绑定80端口&#xA;&#xA;# 客户端使用随机端口&#xA;client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)&#xA;# 系统自动分配端口&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;5-通信模式&#34;&gt;5. 通信模式&lt;/h2&gt;&#xA;&lt;h3 id=&#34;51-通信方式对比&#34;&gt;5.1 通信方式对比&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;模式&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;特点&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;类比&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;单工&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;单向传输&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;广播&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;半双工&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;双向交替传输&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;对讲机&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;全双工&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;双向同时传输&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;电话&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;52-数据编解码&#34;&gt;5.2 数据编解码&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;# 发送数据编码&#xA;message = &amp;#34;你好&amp;#34;&#xA;encoded_data = message.encode(&amp;#39;utf-8&amp;#39;)&#xA;&#xA;# 接收数据解码&#xA;decoded_data = received_data.decode(&amp;#39;utf-8&amp;#39;)&#xA;&#xA;# 支持的编码&#xA;encodings = [&amp;#39;utf-8&amp;#39;, &amp;#39;gb2312&amp;#39;, &amp;#39;ascii&amp;#39;]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;6-最佳实践&#34;&gt;6. 最佳实践&lt;/h2&gt;&#xA;&lt;h3 id=&#34;61-socket编程建议&#34;&gt;6.1 Socket编程建议&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;始终使用 with 语句管理socket&lt;/li&gt;&#xA;&lt;li&gt;设置适当的超时时间&lt;/li&gt;&#xA;&lt;li&gt;正确处理异常&lt;/li&gt;&#xA;&lt;li&gt;及时关闭不用的socket&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;62-示例代码&#34;&gt;6.2 示例代码&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;import socket&#xA;&#xA;def create_udp_server(host=&amp;#39;&amp;#39;, port=8888):&#xA;    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as server:&#xA;        server.bind((host, port))&#xA;        server.settimeout(60)  # 60秒超时&#xA;        try:&#xA;            while True:&#xA;                data, addr = server.recvfrom(1024)&#xA;                if not data:&#xA;                    break&#xA;                # 处理数据&#xA;                process_data(data, addr)&#xA;        except socket.timeout:&#xA;            print(&amp;#34;服务器超时&amp;#34;)&#xA;        except Exception as e:&#xA;            print(f&amp;#34;发生错误: {e}&amp;#34;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;63-安全建议&#34;&gt;6.3 安全建议&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;验证数据来源&lt;/li&gt;&#xA;&lt;li&gt;限制数据包大小&lt;/li&gt;&#xA;&lt;li&gt;实现超时机制&lt;/li&gt;&#xA;&lt;li&gt;做好错误处理&lt;/li&gt;&#xA;&lt;li&gt;考虑加密传输&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
			</item>
			<item>
				<title>Pysocket</title>
				<link>https://sunnnnner.github.io/posts/python/%E6%A8%A1%E5%9D%97/pysocket/</link>
				<pubDate>Thu, 10 Mar 2022 15:46:40 +0800</pubDate>
				<guid>https://sunnnnner.github.io/posts/python/%E6%A8%A1%E5%9D%97/pysocket/</guid>
				<description></description>
			</item>
	</channel>
</rss>
