网络编程是一种使计算机通过网络互相通信的编程实践。在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) 设置阻塞或非阻塞模式。flagTrue时阻塞,False时非阻塞。
getsockopt(level, optname) 获取socket选项的值。
setsockopt(level, optname, value) 设置给定socket选项的值。
关闭 close() 关闭socket连接。
其他 getpeername() 返回远程连接的端口和地址。
getsockname() 返回socket自己的地址和端口。
fileno() 返回socket的文件描述符。
shutdown(how) 关闭连接的一部分,how可以是SHUT_RDSHUT_WRSHUT_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服务器、聊天应用、远程控制和数据传输程序。

点赞(1) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部