网络编程是一种使计算机通过网络互相通信的编程实践。在Python中,可以利用内置模块如socket
来实现网络编程,使得开发者能够创建客户端和服务器应用,实现数据的发送和接收。
基本概念
Socket编程
Socket是网络编程的核心,它是支持TCP/IP和其他网络协议通信的基础。Python的socket
模块提供了丰富的方法来支持Socket通信。
-
创建Socket:使用 socket.socket()
可以创建一个Socket对象。 -
绑定地址: bind()
方法用于绑定地址(IP地址和端口号)到Socket上。 -
监听连接: listen()
方法使Socket进入监听状态,等待客户端的连接请求。 -
接受连接: accept()
方法被用于接受客户端的连接请求。 -
发送和接收数据: send()
和recv()
方法分别用于网络间的数据发送和接收。
TCP和UDP
-
TCP(传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Python中,使用 socket.SOCK_STREAM
来表示TCP。 -
UDP(用户数据报协议):是一种无连接的传输协议,适用于不要求可靠传输的应用,例如实时视频流。在Python中,使用 socket.SOCK_DGRAM
来表示UDP。
Socket 对象方法
类别 | 方法 | 描述 |
---|---|---|
创建 | socket() |
创建新的socket对象。 |
配置 | bind(address) |
绑定地址(IP地址和端口号)到socket。 |
listen([backlog]) |
开始TCP监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。 |
|
connect(address) |
客户端用来连接到服务器地址。 | |
connect_ex(address) |
和connect(address) 类似,但返回错误码而不是抛出异常。 |
|
数据传输 | accept() |
接受TCP客户端连接,返回(conn, address) ,其中conn 是新的socket对象。 |
send(bytes) |
发送TCP数据。返回实际发送的字节数。 | |
recv(bufsize) |
接收TCP数据。bufsize 指定要接收的最大数据量。 |
|
sendto(bytes, address) |
发送UDP数据。将数据发送到指定地址。 | |
recvfrom(bufsize) |
接收UDP数据。返回(bytes, address) 。 |
|
sendall(bytes) |
发送TCP数据,尝试发送所有数据,可能会多次调用底层发送函数。 | |
状态检查 | setblocking(flag) |
设置阻塞或非阻塞模式。flag 为True 时阻塞,False 时非阻塞。 |
getsockopt(level, optname) |
获取socket选项的值。 | |
setsockopt(level, optname, value) |
设置给定socket选项的值。 | |
关闭 | close() |
关闭socket连接。 |
其他 | getpeername() |
返回远程连接的端口和地址。 |
getsockname() |
返回socket自己的地址和端口。 | |
fileno() |
返回socket的文件描述符。 | |
shutdown(how) |
关闭连接的一部分,how 可以是SHUT_RD 、SHUT_WR 、SHUT_RDWR 。 |
实践应用
创建TCP服务器
一个简单的TCP服务器可以接受客户端请求,接收数据并发送响应。
import socket
# 创建Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口号
host = 'localhost'
port = 12345
server_socket.bind((host, port))
# 开始监听
server_socket.listen()
print(f'服务器开始在 {host}:{port} 上监听...')
# 接受客户端连接
client_socket, addr = server_socket.accept()
print(f'连接到 {addr}')
# 接收数据
data = client_socket.recv(1024)
print(f'接收到的数据: {data.decode("utf-8")}')
# 发送数据
client_socket.send(b'Hello, client!')
# 关闭连接
client_socket.close()
server_socket.close()
创建TCP客户端
一个简单的TCP客户端可以连接到服务器,发送数据并接收响应。
import socket
# 创建Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
host = 'localhost'
port = 12345
client_socket.connect((host, port))
# 发送数据
client_socket.send(b'Hello, server!')
# 接收响应
data = client_socket.recv(1024)
print(f'从服务器接收到的数据: {data.decode("utf-8")}')
# 关闭连接
client_socket.close()
使用UDP进行通信
UDP客户端和服务器的编程模式与TCP不同,因为UDP是无连接的。
UDP服务器
import socket
# 创建UDP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口号
host = 'localhost'
port = 12345
server_socket.bind((host, port))
print(f'UDP服务器开始在 {host}:{port} 上监听...')
# 接收数据
data, addr = server_socket.recvfrom(1024)
print(f'从 {addr} 接收到的数据: {data.decode("utf-8")}')
# 发送数据
server_socket.sendto(b'Hello, UDP client!', addr)
# 关闭Socket
server_socket.close()
UDP客户端
import socket
# 创建UDP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 目标服务器地址和端口号
host = 'localhost'
port = 12345
# 发送数据
client_socket.sendto(b'Hello, UDP server!', (host, port))
# 接收响应
data, server = client_socket.recvfrom(1024)
print(f'从服务器接收到的数据: {data.decode("utf-8")}')
# 关闭Socket
client_socket.close()
随着互联网的发展,网络编程已成为开发中不可或缺的一部分。Python因其简洁的语法和强大的标准库,在网络编程方面提供了广泛的支持。通过使用Python,开发者可以轻松构建网络应用,如Web服务器、聊天应用、远程控制和数据传输程序。