第十天 - socket编程基础 - TCP/UDP服务开发 - 练习:简易端口扫描器

Python网络编程入门:从Socket到端口扫描器实战

一、前言:为什么要学网络编程?

在这个万物互联的时代,掌握网络编程技术就像拥有了一把打开互联网世界的钥匙。无论是开发聊天软件、网络游戏,还是构建分布式系统,都需要网络编程作为基础。本教程将从零开始,带你用Python实现网络通信功能,并最终完成一个实用的端口扫描器。


二、Socket编程基础

2.1 什么是Socket?

Socket(套接字)是网络通信的基石,可以理解为两个程序进行通信的端点。就像打电话需要电话线两端的听筒,网络通信也需要两个Socket建立连接。

Socket通信三要素

  1. IP地址(确定目标主机)
  2. 端口号(确定具体应用)
  3. 传输协议(TCP/UDP)

2.2 TCP vs UDP

特性 TCP UDP
连接方式 面向连接 无连接
可靠性 可靠传输 尽力而为
传输效率 较低 较高
适用场景 文件传输、网页浏览 视频会议、在线游戏

三、TCP服务开发实战

3.1 服务端开发(四步曲)

python 复制代码
import socket

# 1. 创建Socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2. 绑定地址和端口
server_socket.bind(('0.0.0.0', 8888))  # 0.0.0.0表示监听所有网络接口

# 3. 开始监听
server_socket.listen(5)  # 参数指定最大等待连接数
print("TCP服务器已启动,等待客户端连接...")

# 4. 接受客户端连接
client_socket, client_addr = server_socket.accept()
print(f"接收到来自 {client_addr} 的连接")

# 接收数据
data = client_socket.recv(1024)
print(f"收到消息:{data.decode('utf-8')}")

# 发送响应
client_socket.send("消息已收到!".encode('utf-8'))

# 关闭连接
client_socket.close()
server_socket.close()

3.2 客户端开发

python 复制代码
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    client.connect(('127.0.0.1', 8888))  # 连接服务器
    client.send("Hello Server!".encode('utf-8'))  # 发送消息
    
    response = client.recv(1024)  # 接收响应
    print(f"服务器响应:{response.decode('utf-8')}")
    
except Exception as e:
    print(f"连接错误:{str(e)}")
finally:
    client.close()

四、UDP服务开发实战

4.1 UDP服务端

python 复制代码
import socket

udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('0.0.0.0', 9999))

print("UDP服务器已启动...")
while True:
    data, client_addr = udp_server.recvfrom(1024)  # 接收数据和客户端地址
    print(f"收到来自 {client_addr} 的消息:{data.decode()}")
    
    reply = "消息已接收".encode('utf-8')
    udp_server.sendto(reply, client_addr)  # 发送响应到指定地址

4.2 UDP客户端

python 复制代码
import socket

udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server_addr = ('127.0.0.1', 9999)
message = "这是UDP测试消息".encode('utf-8')

udp_client.sendto(message, server_addr)  # 发送消息
response, _ = udp_client.recvfrom(1024)  # 接收响应
print("收到响应:", response.decode())

udp_client.close()

五、实战:简易端口扫描器

5.1 扫描原理

端口扫描的核心是尝试与目标主机的指定端口建立TCP连接。如果能成功建立连接,说明该端口是开放的。

5.2 代码实现

python 复制代码
import socket
from concurrent.futures import ThreadPoolExecutor

def scan_port(host, port):
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(1)  # 设置超时时间
            result = s.connect_ex((host, port))  # 返回0表示成功
            
            if result == 0:
                print(f"端口 {port} 开放")
                return port
    except Exception as e:
        pass
    return None

def port_scanner(host, start_port=1, end_port=1024):
    print(f"开始扫描 {host}...")
    open_ports = []
    
    with ThreadPoolExecutor(max_workers=100) as executor:  # 使用线程池加速扫描
        futures = []
        for port in range(start_port, end_port+1):
            futures.append(executor.submit(scan_port, host, port))
        
        for future in futures:
            if (result := future.result()) is not None:
                open_ports.append(result)
    
    print(f"\n扫描完成!开放端口:{sorted(open_ports)}")

if __name__ == "__main__":
    target = input("请输入目标IP地址:")
    port_scanner(target, 70, 100)  # 示例扫描70-100端口

5.3 代码解析

  1. socket.settimeout(1):设置1秒连接超时
  2. connect_ex():相比connect()不会抛出异常,而是返回错误码
  3. 使用线程池加速扫描过程
  4. 扫描常用端口范围(1-1024)

注意:实际使用中请遵守网络安全法,仅扫描自己拥有权限的主机!


六、网络编程进阶知识

6.1 常见问题处理

  • 粘包问题:TCP是流式协议,需要自定义消息边界
  • 大文件传输:分片传输 + 校验机制
  • 多客户端处理:使用多线程或异步IO

6.2 提高扫描效率的技巧

  1. 使用异步IO(asyncio)
  2. 实施SYN扫描(需要Raw Socket权限)
  3. 整合服务指纹识别

七、总结与拓展

通过本文的学习,我们已经掌握了:

  • Socket通信的基本原理
  • TCP/UDP服务的开发方法
  • 端口扫描器的实现原理

推荐学习路线

  1. 学习select/epoll多路复用技术
  2. 研究Scapy网络包操作库
  3. 了解asyncio异步网络编程
  4. 学习网络安全相关知识

网络编程就像搭建数字世界的桥梁,希望本文能成为你通往更广阔技术天地的第一块基石。在实际开发中,记得始终遵循"Fail Fast"原则,做好异常处理和资源释放,才能构建出稳定可靠的网络应用。

相关推荐
T0uken16 分钟前
【Linux】HAProxy:结合 WG 实现内网 TCP 反代
linux·运维·tcp/ip
00后程序员张1 小时前
发版前后的调试对照实践:用 WebDebugX 与多工具构建上线验证闭环
websocket·网络协议·tcp/ip·http·网络安全·https·udp
玩转4G物联网2 小时前
零基础玩转物联网-串口转以太网模块如何快速实现与HTTP服务器通信
服务器·网络·物联网·网络协议·tcp/ip·http·fs100p
创小匠3 小时前
《创始人IP打造:知识变现的高效路径》
人工智能·网络协议·tcp/ip
z10_144 小时前
台湾住宅IP哪家好,怎么找到靠谱的海外住宅IP代理商
网络·网络协议·tcp/ip
zqmattack4 小时前
SQL 注入:iBatis与修复
网络·数据库·sql
水水沝淼㵘5 小时前
嵌入式开发学习日志(数据库II && 网页制作)Day38
服务器·c语言·网络·数据结构·数据库·学习
天翼云开发者社区5 小时前
SRv6 验证实验
网络
领世达检测V133529092496 小时前
路由器欧盟EN 18031网络安全认证详细解读
网络
黎茗Dawn6 小时前
11.TCP三次握手
网络·tcp/ip