第十天 - 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"原则,做好异常处理和资源释放,才能构建出稳定可靠的网络应用。

相关推荐
阳光普照世界和平12 分钟前
网络安全与信息安全防护措施
网络·安全
学不完的15 分钟前
ospf综合实验
网络·智能路由器
-曾牛40 分钟前
Git完全指南:从入门到精通版本控制 ------- Git仓库创建 (5)
大数据·网络·git·学习·elasticsearch·个人开发
vvilkim44 分钟前
深入解析TCP Keep-Alive机制:原理、作用与最佳实践
网络·网络协议·tcp/ip
维C泡泡1 小时前
网络编程 套接字
网络
耕耘虫2 小时前
解决 .Net 6.0 项目发布到IIS报错:HTTP Error 500.30
网络·网络协议·http·iis·net·静态文件·.net 6.0
鸡鸭扣3 小时前
系统设计面试总结:高性能相关:CDN(内容分发网络)、什么是静态资源、负载均衡(Nginx)、canal、主从复制
网络·面试·负载均衡
christine-rr3 小时前
【25软考网工笔记】第二章 数据通信基础(2) 信道延迟计算
网络·笔记·网络工程师·软考
科技小E3 小时前
5G时代,视频分析设备平台EasyCVR实现通信基站远程安全便捷管控
大数据·网络·人工智能·音视频·安防监控
前端切图仔0014 小时前
WebSocket 技术详解
前端·网络·websocket·网络协议