Python3 网络编程详解

概述

Python 提供了丰富的网络编程支持,包括低级别的 Socket 编程和高级别的 SocketServer 模块。本文将详细介绍如何在 Python 中使用 Socket 进行网络编程,并通过具体的代码示例来展示服务器和客户端的实现。

什么是 Socket?

Socket 又称“套接字”,是应用程序通过网络进行通信的接口。应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

Socket 编程基础
1. 创建 Socket

在 Python 中,我们使用 socket() 函数来创建套接字。语法格式如下:

socket.socket([family[, type[, proto]]])
  • family:套接字家族可以是 AF_UNIX 或者 AF_INET
  • type:套接字类型可以是 SOCK_STREAM(面向连接的 TCP)或 SOCK_DGRAM(无连接的 UDP)。
  • proto:一般不填,默认为 0。
2. 常用的 Socket 方法
方法描述
s.bind(address)绑定地址(host, port)到套接字。
s.listen(backlog)开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。
s.accept()被动接受 TCP 客户端连接,返回 (conn, address),其中 conn 是新的套接字对象,address 是客户端地址。
s.connect(address)主动初始化 TCP 服务器连接。
s.connect_ex(address)connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常。
s.recv(bufsize[, flags])接收 TCP 数据,返回值是接收到的数据。
s.send(string[, flags])发送 TCP 数据,返回值是发送的字节数。
s.sendall(string[, flags])完整发送 TCP 数据,成功返回 None,失败抛出异常。
s.recvfrom(bufsize[, flags])接收 UDP 数据,返回值是 (data, address)。
s.sendto(string, address)发送 UDP 数据到指定地址。
s.close()关闭套接字。
s.getpeername()返回连接套接字的远程地址。
s.getsockname()返回套接字自己的地址。
s.setsockopt(level, optname, value)设置给定套接字选项的值。
s.getsockopt(level, optname[, buflen])返回套接字选项的值。
s.settimeout(timeout)设置套接字操作的超时期。
s.gettimeout()返回当前超时期的值。
s.fileno()返回套接字的文件描述符。
s.setblocking(flag)设置套接字为阻塞或非阻塞模式。
s.makefile()创建一个与该套接字相关联的文件对象。
简单实例
1. 服务端

服务端代码如下:

#!/usr/bin/python3
# 文件名:server.py

# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 设置端口号
port = 9999

# 绑定端口号
serversocket.bind((host, port))

# 设置最大连接数,超过后排队
serversocket.listen(5)

while True:
    # 建立客户端连接
    clientsocket, addr = serversocket.accept()

    print("连接地址: %s" % str(addr))

    msg = '欢迎访问菜鸟教程!' + "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()
  • import socket:导入 socket 模块。
  • import sys:导入 sys 模块。
  • serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM):创建一个 TCP 套接字对象。
  • host = socket.gethostname():获取本地主机名。
  • port = 9999:设置端口号。
  • serversocket.bind((host, port)):将套接字绑定到指定的地址和端口。
  • serversocket.listen(5):开始监听,最多允许 5 个连接排队。
  • while True::无限循环,等待客户端连接。
  • clientsocket, addr = serversocket.accept():接受客户端连接,返回新的套接字对象和客户端地址。
  • print("连接地址: %s" % str(addr)):打印客户端地址。
  • msg = '欢迎访问菜鸟教程!' + "\r\n":准备发送的消息。
  • clientsocket.send(msg.encode('utf-8')):发送消息。
  • clientsocket.close():关闭客户端连接。
2. 客户端

客户端代码如下:

#!/usr/bin/python3
# 文件名:client.py

# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 设置端口号
port = 9999

# 连接服务,指定主机和端口
s.connect((host, port))

# 接收小于 1024 字节的数据
msg = s.recv(1024)

s.close()

print(msg.decode('utf-8'))
  • import socket:导入 socket 模块。
  • import sys:导入 sys 模块。
  • s = socket.socket(socket.AF_INET, socket.SOCK_STREAM):创建一个 TCP 套接字对象。
  • host = socket.gethostname():获取本地主机名。
  • port = 9999:设置端口号。
  • s.connect((host, port)):连接到指定的主机和端口。
  • msg = s.recv(1024):接收不超过 1024 字节的数据。
  • s.close():关闭套接字。
  • print(msg.decode('utf-8')):打印接收到的消息。
测试
  1. 打开第一个终端,运行服务端代码:

    $ python3 server.py
    
  2. 打开第二个终端,运行客户端代码:

    $ python3 client.py
    

    客户端终端会输出:

    欢迎访问菜鸟教程!
    
  3. 查看第一个终端,会看到有以下信息输出:

    连接地址: ('192.168.0.118', 33397)
    
Python Internet 模块

Python 提供了许多用于网络编程的模块,以下是常用的几个模块及其功能:

协议功能用处端口号Python 模块
HTTP网页访问80http.client, urllib, xmlrpc.client
NNTP阅读和张贴新闻文章,俗称为"帖子"119nntplib
FTP文件传输20ftplib, urllib
SMTP发送邮件25smtplib
POP3接收邮件110poplib
IMAP4获取邮件143imaplib
Telnet命令行23telnetlib
Gopher信息查找70gopherlib, urllib
总结

本文详细介绍了如何在 Python 中使用 Socket 进行网络编程,并通过具体的代码示例展示了服务器和客户端的实现。通过使用 socket 模块,我们可以创建和管理套接字,实现基本的网络通信功能。


posted @   燕鹏  阅读(164)  评论(0编辑  收藏  举报  
(评论功能已被禁用)
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示