📜  Python中的套接字编程(1)

📅  最后修改于: 2023-12-03 14:46:40.283000             🧑  作者: Mango

Python中的套接字编程

套接字编程是计算机网络通讯中的基础概念,套接字(Socket)指的是一种通信机制,是对TCP/IP协议中的网络通信细节的抽象。Python中提供了socket模块来支持套接字编程。

套接字的类型

在Python中,常用的套接字类型有两种:

  1. 基于TCP协议的流套接字(SOCK_STREAM)
  2. 基于UDP协议的数据报套接字(SOCK_DGRAM)

流套接字提供面向连接的服务,采用TCP协议进行通信,数据可以以流的形式在两个进程之间进行传输。而数据报套接字则是无连接的,采用UDP协议进行通信,数据被划分为消息,每个消息是一个数据包,可以通过多个数据包进行传输。

套接字的创建

在Python中,使用socket模块的socket函数创建套接字,其格式如下:

socket.socket(family, type[, proto])

其中,family参数是地址家族,可以是AF_UNIX、AF_INET或AF_INET6等;type参数表示套接字的类型,可以是SOCK_STREAM或SOCK_DGRAM;proto参数通常可以省略,表示使用默认的传输协议。

具体创建TCP套接字和UDP套接字的代码示例如下:

import socket

# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
套接字的绑定和监听

在使用套接字之前,需要调用bind方法将其绑定到一个IP地址和端口号上,从而使得客户端可以通过该IP地址和端口号来访问服务端。而对于TCP套接字,还需要调用listen方法开启监听,等待客户端的连接。

具体示例代码如下:

import socket

host = '127.0.0.1'
port = 12345

# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 将TCP套接字绑定到IP地址和端口号上
tcp_sock.bind((host, port))

# 开始监听,最大连接数为5
tcp_sock.listen(5)

print('TCP Server started on {}:{}'.format(host, port))

# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 将UDP套接字绑定到IP地址和端口号上
udp_sock.bind((host, port))

print('UDP Server started on {}:{}'.format(host, port))
套接字的连接和发送

对于TCP套接字,需要在建立连接之前调用connect方法连接到服务端。而对于UDP套接字,则不需要建立连接,直接调用sendto方法发送数据即可。

具体示例代码如下:

import socket

host = '127.0.0.1'
port = 12345

# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务端
tcp_sock.connect((host, port))

# 向服务端发送数据
tcp_sock.sendall(b'Hello, TCP Socket!')

# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 向服务端发送数据
udp_sock.sendto(b'Hello, UDP Socket!', (host, port))
套接字的接收和关闭

套接字可以通过recv方法来接收服务端发送的数据,该方法会一直阻塞,直到有数据到达或服务端关闭连接为止。而close方法用于关闭套接字的连接和释放资源。

具体示例代码如下:

import socket

host = '127.0.0.1'
port = 12345

# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务端
tcp_sock.connect((host, port))

# 向服务端发送数据
tcp_sock.sendall(b'Hello, TCP Socket!')

# 接收服务端发送的数据
data = tcp_sock.recv(1024)
print('Received from TCP Server:', data)

# 关闭TCP套接字
tcp_sock.close()

# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 向服务端发送数据
udp_sock.sendto(b'Hello, UDP Socket!', (host, port))

# 接收服务端发送的数据
data, addr = udp_sock.recvfrom(1024)
print('Received from UDP Server:', data)

# 关闭UDP套接字
udp_sock.close()
总结

套接字编程是Python中的重要主题之一,通过socket模块可以方便地创建和使用套接字,实现基于TCP和UDP协议的网络通信功能。需要注意的是,在使用套接字进行网络编程时,需要掌握一些底层的网络通信原理和技术,才能更好地应对复杂的网络环境和问题。