当你启动一个服务器时,你要决定"谁能连进来"。 这取决于你绑定到哪个地址。
()
| 210 | # ============================================================ |
| 211 | |
| 212 | def lesson_3_binding(): |
| 213 | """ |
| 214 | 当你启动一个服务器时,你要决定"谁能连进来"。 |
| 215 | 这取决于你绑定到哪个地址。 |
| 216 | """ |
| 217 | print("\n" + "=" * 60) |
| 218 | print("第三课: 监听地址——谁能连进来?") |
| 219 | print("=" * 60) |
| 220 | |
| 221 | print(""" |
| 222 | ┌──────────────────────────────────────────────────────────┐ |
| 223 | │ 你的电脑 │ |
| 224 | │ │ |
| 225 | │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ |
| 226 | │ │ loopback │ │ WiFi 网卡 │ │ 以太网卡 │ │ |
| 227 | │ │ 127.0.0.1 │ │ 192.168.1.5 │ │ 10.0.0.100 │ │ |
| 228 | │ └──────┬──────┘ └──────┬──────┘ └──────┬──────────┘ │ |
| 229 | │ │ │ │ │ |
| 230 | │ ▼ ▼ ▼ │ |
| 231 | │ ┌─────────────────────────────────────────────────────┐│ |
| 232 | │ │ 操作系统网络栈 ││ |
| 233 | │ │ 服务器绑定到哪个地址,决定接受谁的连接: ││ |
| 234 | │ │ ││ |
| 235 | │ │ bind("127.0.0.1", 8080) ││ |
| 236 | │ │ → 只接受本机连接(最安全) ││ |
| 237 | │ │ → 外面的电脑连不上你 ││ |
| 238 | │ │ ││ |
| 239 | │ │ bind("192.168.1.5", 8080) ││ |
| 240 | │ │ → 只接受通过 WiFi 来的连接 ││ |
| 241 | │ │ ││ |
| 242 | │ │ bind("0.0.0.0", 8080) ││ |
| 243 | │ │ → 接受所有网卡的连接(最开放) ││ |
| 244 | │ │ → 局域网里的其他设备都能连上你 ││ |
| 245 | │ └─────────────────────────────────────────────────────┘│ |
| 246 | └──────────────────────────────────────────────────────────┘ |
| 247 | """) |
| 248 | |
| 249 | # 实际演示不同绑定的效果 |
| 250 | print(" 实际测试:") |
| 251 | |
| 252 | # 绑定到 127.0.0.1 |
| 253 | s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 254 | s1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| 255 | s1.bind(("127.0.0.1", 0)) |
| 256 | port1 = s1.getsockname()[1] |
| 257 | print(f" bind('127.0.0.1', {port1}) → 只有本机能连") |
| 258 | s1.close() |
| 259 | |
| 260 | # 绑定到 0.0.0.0 |
| 261 | s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 262 | s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| 263 | s2.bind(("0.0.0.0", 0)) |
| 264 | port2 = s2.getsockname()[1] |
| 265 | print(f" bind('0.0.0.0', {port2}) → 任何人都能连") |
| 266 | s2.close() |
| 267 | |
| 268 | print(f""" |
| 269 | 开发时常见场景: |
no outgoing calls
no test coverage detected