Python 的 socket
模块是用于网络编程的标准库,提供了低级别的网络接口,允许程序通过网络进行通信。以下是对 Python socket
模块的简要介绍,包括其基本概念、常用功能和示例。
基本概念
-
Socket:Socket 是网络通信的端点。它可以是一个客户端或服务器,允许在网络上发送和接收数据。
-
协议:
socket
模块支持多种网络协议,最常用的是 TCP(传输控制协议)和 UDP(用户数据报协议)。- TCP:面向连接的协议,提供可靠的数据传输。
- UDP:无连接的协议,传输速度快,但不保证数据的可靠性。
-
IP 地址和端口:每个 socket 都与一个 IP 地址和一个端口号相关联。IP 地址标识网络上的设备,端口号标识设备上的特定服务。
常用功能
-
创建 Socket:
- 使用
socket.socket()
创建一个新的 socket 对象。 - 需要指定地址族(如
socket.AF_INET
表示 IPv4)和套接字类型(如socket.SOCK_STREAM
表示 TCP)。
- 使用
-
绑定(Bind):
- 使用
bind()
方法将 socket 绑定到特定的 IP 地址和端口号。
- 使用
-
监听(Listen):
- 服务器使用
listen()
方法开始监听传入的连接请求。
- 服务器使用
-
接受连接(Accept):
- 使用
accept()
方法接受客户端的连接请求,返回一个新的 socket 对象和客户端的地址。
- 使用
-
连接(Connect):
- 客户端使用
connect()
方法连接到服务器。
- 客户端使用
-
发送和接收数据:
- 使用
send()
和sendall()
方法发送数据。 - 使用
recv()
方法接收数据。
- 使用
-
关闭 Socket:
- 使用
close()
方法关闭 socket 连接。
- 使用
tcp客户端
import socket
target_host = "127.0.0.1"
target_port = 65423
# 创建客户端套接字
# socket.AF_INET:表示选择IPv4的地址,socket.SOCK_STREAM:表示TCP传输协议类型
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接客户端 connect the client
client.connect((target_host,target_port))
#使用GET方法发送数据
message = "hello,socker"
client.sendall(message.encode())
#返回数据最大字符为4096
response = client.recv(4096)
#打印返回数据
print(response.decode())
#关闭连接
client.close()
tcp服务端
import socket
import threading
IP = "0.0.0.0"
PORT = 65423
def main():
# 创建客户端套接字对象
# socket.AF_INET:表示选择IPv4的地址,socket.SOCK_STREAM:表示TCP传输协议类型
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定PORT和IP
server.bind((IP, PORT))
# 设置客户端最大连接数量5
server.listen(5)
# 打印开启监听IP和PORT
print(f" [*] Listening on {IP}:{PORT}")
# 建立连接
# 让服务器进入主循环中,并在该循环中等待外来连接
while True:
client, address = server.accept()
# 打印已接受的客户端连接的ip和端口
print(f"[*] Accepted connection from {address[0]}:{address[1]}")
# 创建一个新的线程client_handler,用于处理与该客户端的通信
client_handler = threading.Thread(target=handle_client, args=(client,))
# 启动线程开始处理客户端请求
client_handler.start()
# 定义处理客户端请求的函数handle_client,接受一个客户端套接字作为参数
def handle_client(client_socket):
# 使用with语句确保在处理完客户端请求后自动关闭套接字
with client_socket as sock:
# 从客户端最多接受1024字节的数据
request = sock.recv(1024)
# 打印接收到的请求内容,使用decode("utf-8")将字节数据解码为字符串
print(f"[*] Received: {request.decode('utf-8')}") # 修正引号问题
# 向客户端发送确认消息ACK,表示已经接收到请求
sock.send(b"ACK")
if __name__ == "__main__":
main()
使用编写的tcp客户端给服务发送几个测试的数据包,应该会看到以下输出
[*] Listening on 0.0.0.0:65423
[*] Accepted connection from 127.0.0.1:63382
[*] Received: hello,socker