概述
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 方法
方法 |
描述 |
|
绑定地址(host, port)到套接字。 |
|
开始 TCP 监听。 |
|
被动接受 TCP 客户端连接,返回 (conn, address),其中 |
|
主动初始化 TCP 服务器连接。 |
|
|
|
接收 TCP 数据,返回值是接收到的数据。 |
|
发送 TCP 数据,返回值是发送的字节数。 |
|
完整发送 TCP 数据,成功返回 |
|
接收 UDP 数据,返回值是 (data, address)。 |
|
发送 UDP 数据到指定地址。 |
|
关闭套接字。 |
|
返回连接套接字的远程地址。 |
|
返回套接字自己的地址。 |
|
设置给定套接字选项的值。 |
|
返回套接字选项的值。 |
|
设置套接字操作的超时期。 |
|
返回当前超时期的值。 |
|
返回套接字的文件描述符。 |
|
设置套接字为阻塞或非阻塞模式。 |
|
创建一个与该套接字相关联的文件对象。 |
简单实例
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'))
:打印接收到的消息。
测试
- 打开第一个终端,运行服务端代码:
$ python3 server.py
- 打开第二个终端,运行客户端代码:
$ python3 client.py
客户端终端会输出:
欢迎访问菜鸟教程!
- 查看第一个终端,会看到有以下信息输出:
连接地址: ('192.168.0.118', 33397)
Python Internet 模块
Python 提供了许多用于网络编程的模块,以下是常用的几个模块及其功能:
协议 |
功能用处 |
端口号 |
Python 模块 |
HTTP |
网页访问 |
80 |
|
NNTP |
阅读和张贴新闻文章,俗称为"帖子" |
119 |
|
FTP |
文件传输 |
20 |
|
SMTP |
发送邮件 |
25 |
|
POP3 |
接收邮件 |
110 |
|
IMAP4 |
获取邮件 |
143 |
|
Telnet |
命令行 |
23 |
|
Gopher |
信息查找 |
70 |
|
总结
本文详细介绍了如何在 Python 中使用 Socket 进行网络编程,并通过具体的代码示例展示了服务器和客户端的实现。通过使用 socket
模块,我们可以创建和管理套接字,实现基本的网络通信功能。