📅  最后修改于: 2023-12-03 14:46:40.283000             🧑  作者: Mango
套接字编程是计算机网络通讯中的基础概念,套接字(Socket)指的是一种通信机制,是对TCP/IP协议中的网络通信细节的抽象。Python中提供了socket模块来支持套接字编程。
在Python中,常用的套接字类型有两种:
流套接字提供面向连接的服务,采用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协议的网络通信功能。需要注意的是,在使用套接字进行网络编程时,需要掌握一些底层的网络通信原理和技术,才能更好地应对复杂的网络环境和问题。